C语言学习笔记_位运算
C语言学习笔记_位运算
知识点记录
基本位运算
按位与:全1为1,见0为0;与1相与无变化,与0相与变为0;可用于特定位清零
按位或:见1为1,全0为0;与1相或变为1,与0相或无变化;可用于特定位置1
异或:相同为0,不同为1;与1异或会取反,与0异或无变化;可用于特定位取反
移位运算
无符号数:左移右侧补0,右移左侧补0
有符号数:左移右侧补0,右移左侧补符号位
构造特定二进制数
unsigned int a, b;
a = (0x1<<3); //构造二进制数0000 …… 0000 1000
b = (0x1<<3) | (0x1<<6); //构造二进制数0000 …… 0100 1000
unsigned int c,d;
c = ~(0x1<<3); //构造二进制数1111 …… 1111 0111
d = ~((0x1<<3) | (0x1)<<6); //构造二进制数1111 …… 1011 0111
测试
给定一个整形数a,设置a的bit3~bit7,保持其他位不变。
a |= 0x1F<<3;
给定一个整形数a,清除a的bit15~bit23,保持其他位不变。
a &= ~(0x1FF<<15);
给定一个整形数a,取出a的bit3~bit8。
a = (a>>3) & 0x3F;
给一个寄存器的bit7~bit17中的值加17
unsigned int b; //定义临时变量
b = (a>>7) & 0x7FF; //获取bit7~bit17中的值
b += 17; //对原来的值增加17
a &= ~(0x7FF<<7); //对应位清零
a |= b<<7 ; //对应位赋值
给一个寄存器的bit7-bit17赋值937,同时给bit21-bit25赋值17。
a &= ~((0x7FF<<7) | (0x1F<<21)); //对应位清零
a |= (937<<7) | (17<<21); //对应位赋值
用宏定义将32位数x的第n位置位
#define SET_BIT_N(x, n) (x | (1U<<(n-1))) //数字后面加U表示无符号
用宏定义将32位数x的第n位清零
#define CLEAR_BIT_N(x, n) (x & ~(1U<<(n-1)))
用宏定义将32位数x的第n位到第m位置位
#define GET_ALLONE_BITS(n, m) (~(~(0U)<<(m-n+1))) //得到m-n+1位全为1的二进制数
#define SET_BIT_N_M(x, n, m) (x | GET_ALLONE_BITS(n, m)<<(n-1)) //置位
截取变量x的第n到第m位
#define GET_BIT(x, n, m) (x>>(n-1) & GET_ALLONE_BITS(n , m))