如何理解左移和右移
左移理解
左移就是:丢弃最高位,0补最低位(向高位移动)
例如
char i=1; //00000001
i=i<<2;//把i里面的值左移 00000100
(也就是10进制的4,所以说左移1位相当于乘以2的n次方)有符号数不完全适用
这里i的二进制位数与定义i的类型有关,
右移理解
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变(向低位移动)
例如:
int i=0x80000000;
i=i>>1;//i的值不会变成0x40000000,而会变成0xc0000000;
就是说,符号位右移动后,正数的话补0,负数补1,就是汇编语言中的算术右移,同样当移动的位数超过类型长度,会取余数,然后移动余数个数。
二,位操作的实际应用
(1)特定位清零用&
例如:将0Xaaaaaaaa的bit8~bit15清零,其它位保持不变。
分析:unsigned int a=0xAAAAAAAA;
unsigned int b=0xFFFF00FF;
unsigned int c;
c=a&b;
printf(“c=0x%x”,c) //c=0xaaaa00aa
(2)特定位置1用 |
例如:将0xffff00ff的bit8 ~bit15置1,其他位保持不变。
unsigned int a = 0xffff00ff;
unsigned int b = 0x000ff00;
unsigned int c;
c = a | b;
printf("c = 0x%x ", c); // = 0xffffffff
(3)特定位取反用^
例如:将0xffff00ff的bit8 ~bit15取反,其余保持不变
unsigned int a = 0xffff00ff;
unsigned int b = 0xff00;
unsigned int c;
c = a ^ b;
printf("c = 0x%x ", c); // = 0xffffffff