C/C++中的&逻辑与、取反、左移、右移 的一些用法

 

1. len & ~3 :计算整数len中4的最大倍数,去掉余数(即等价于:len - len%4)

for(int i=0; i< len & ~3; i++){ //i < (len-len%4)

}

&:这里是 “逻辑与”操作;

~: “取反”,按位取反操作;

详细描述:(1) 数字 3 的二进制表示为(都用八位表示):00000011,则 ~3:  11111100  ;

                  (2) 假设len=15的二进制为( 00001111) ;

                  (3) len的二进制数与~3的二进制进行逻辑与操作 : 00001111 & 11111100 = 00001100(即:12; 也即是:i<12 )

可以看出:得数12正是:15之间最大的4的倍数。15 - 15%4 = 12

实现思想:掩盖len底部最后两位,使最后两位与“00”进行逻辑与,使其变为00,实现:去掉余数。

 

2. 取余(使用&):一般我们都是通过:num%4的形式,就可以求出num除以4的余数。

类似 ,以上面那种方式,除4取余实现方法: num&3 . 解释同上,num的二进制直接与3的二进制0011进行“逻辑与”操作。

 

3. 乘 / 除(使用左移>>和右移<<):

num*4 等价于 num<<2(左移两位);乘8 也就是左移3位( << 3 );

num / 4 等价于 num>>2(右移两位);除以 8 也就是右移3位( >>3 ) ;

注意:

左移: 丢弃最高位,0补最低位;

右移:对于有符号整数来说,比如int类型,右移会保持符号位不变;符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

你可能感兴趣的:(C与C++,c++)