如何使用指定位运算符实现按位取反NOT(~)操作?
结论
可以实现,核心思路是用全1掩码和输入值做异或运算,完全仅靠你提到的5种运算符就能完成。
实现原理
按位取反~x的本质是将x的每一位二进制位翻转:0变1,1变0。而异或运算的规则是1^1=0、0^1=1,只要构造一个所有位都为1的掩码full_mask,就可以通过x ^ full_mask得到和~x完全一致的结果。
全1掩码构造方案
根据你使用的整数位宽,有两种常用构造方式:
方案1:已知整数位宽(比如32位/64位有符号整数,右移为算术右移)
如果你的语言中整数右移是算术右移(有符号数右移时补符号位),只需要两步即可得到全1掩码:
- 把1左移到最高位:
high_bit = 1 << (位宽 - 1),比如32位整数就是1 << 31 - 把最高位为1的数右移满位宽减1次,算术右移会自动补1,最终得到全1值:
full_mask = high_bit >> (位宽 -1)
方案2:未知位宽/右移为逻辑右移(右移补0)
可以通过多次左移+或运算构造全1掩码,以32位整数为例,只需要5次操作就能得到全1掩码,代码如下:
full_mask = 1 full_mask |= full_mask << 1 full_mask |= full_mask << 2 full_mask |= full_mask << 4 full_mask |= full_mask << 8 full_mask |= full_mask << 16
如果是64位整数,只需要在最后多加一步full_mask |= full_mask << 32即可。
最终实现
得到全1掩码后,只需要执行x ^ full_mask,就能得到和~x完全等价的结果。
举个4位整数的示例:
x=5,二进制为0101,full_mask为1111,异或后得到1010,和~5的结果完全一致。
内容的提问来源于stack exchange,提问作者bp99
相关产品推荐
相关产品推荐

