c语言用位运算将一个数清零,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<

用宏定义将32位数x的第n位清零

#define CLEAR_BIT_N(x, n)(x & ~(1U<

用宏定义将32位数x的第n位到第m位置位

#define GET_ALLONE_BITS(n, m)(~(~(0U)<

#define SET_BIT_N_M(x, n, m)(x | GET_ALLONE_BITS(n, m)<

截取变量x的第n到第m位

#define GET_BIT(x, n, m)(x>>(n-1) & GET_ALLONE_BITS(n , m))

你可能感兴趣的:(c语言用位运算将一个数清零)