&与&~
&是与运算符这个我们都知道,那&~是什么,是与非吗?
答: &~并不是位运算与非,他只是一种简单的复合运算。 A&~B = A&(~B)。类似于m+++n等价于(m++)+n。
&~的含义:
A&~B <==> A &(~B)。 先对B取反,然后和A做与运算。
m&(n-1) 和 m&~(n-1)
有博客写到
运算符m&(n-1)的结果是求出m/n的剩余数据个数(余数)
运算符m&~(n-1)的结果是求出剩余数据的起始位置
并给出测试数据1000和64。
look
**上面结论是不完全正确的,忽略了结论成论的前提: n必须是2的整数此幂。**比如2, 4, 8, 64 。。。
如果你测试了,发现1000和64的&和&~运算符合结论,但如果换成10和3,那么结果分别是8,2,显然不满足结论。
分析
为什么m&~(n-1)如果符合结果是求出剩余数据的起始位置,必须n为2的幂次呢?
注:这里十进制为了方便只显示两个字节,不影响最终结论。
m = 1000; // 二进制: 00000111 11010000
n = 64; // 二进制: 00000000 01000000
n-1 = 63; // 二进制: 00000000 00111111
~(n-1) = -64;// 二进制: 11111111 11000000
m&(n-1) // 1 & 0 = 0, 0 & 0 = 0. 由于n-1的高位全为0,所有m&(n-1)的结果
// 以n的最左边的1划分左右两部分,左边全为0, 右边等于m的右边6位。
// 对应二进制,第七位的基是64,后面高位也全是的倍数。128、256
// 也就是说是64的倍数已经去除,剩下的是小于64的部分。
// 所有m&(n-1)的结果是求出m/n的剩余数据个数(余数),如果n不是2的幂次
// 也就不能这样划分,结论也不会是这样。
m&~(n-1), 也是一样的分析。
博主还有事,就不写了。溜了溜了。