如何利用~ & ^ | + 及移位运算符来实现 ! 的功能

**

如何利用 ~ & ^ | + << >> 等运算符来实现 ! 的功能

**
假设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就实现了 ! 的功能

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值