C/C++ &和&~

&与&~

&是与运算符这个我们都知道,那&~是什么,是与非吗?
答: &~并不是位运算与非,他只是一种简单的复合运算。 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), 也是一样的分析。
博主还有事,就不写了。溜了溜了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值