**
如何利用 ~ & ^ | + << >> 等运算符来实现 ! 的功能
**
假设x为非0元素,那么 !x=1,x为0,则!x=1
把他们写成2进制的来观察一下
1.先随便列几个数来观察一下规律
#1
x=00000000;
!x=00000001;
#2
x=01010010;
!x=00000000;
#3
x=10111000;
!x=00000000;
可以看出来,只要x中含有1,最后 !x 就得为全0,x为全0的话,只要最后一位加上1就行了
2.进一步去细想:
(1)x没出现1,想办法变为全0,最后加上0x1
(2)x出现1,想办法变为全1,最后加上0x1(因为会溢出就会变成全0)
3.怎么实现x出现1为全1
(1)只要最高位是1,然后右移31位
4.怎么实现最高位是1
对x进行取反,然后加1,这样子如果是全0的话最后得到的也会是全0(溢出了),如果含有1的话,则在最先出现1的比特位上会变成1,这个1左边是取反的结果,右边全是0。然后将取反加1后的结果与x取或,这样就能得到以这个1位界限,左边全是1,右边全是0的结果,当然,最高位也是1。
#1
x=10101010;
~x+1=01010110;
x|(~x+1)=11111110;
#2
x=00000000;
~x=11111111;
~x+1=00000000;
x|(~x+1)=00000000
5.这样就得到了我们要的结果,最后只需要将得到的结果右移31位,然后加上1就实现了 ! 的功能