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++中位操作符的常见用途,如利用`&`进行4的倍数计算,`~`取反操作,以及`<<`和`>>`进行快速乘除。通过位操作,可以高效地完成整数处理,例如`len & ~3`用于获取4的最大倍数,`num & 3`用于求除4的余数,以及`num << 2`和`num >> 2`分别用于快速乘4和除4。这些技巧在编程中能提升计算效率。
1140

被折叠的 条评论
为什么被折叠?



