用异或代替按位求反

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用异或代替按位求反相关的知识,希望对你有一定的参考价值。

按位取反,意思是原来的每一位,1变0,0变1。

按照这个1变0,0变1的标准,若求x的按位取反值,可以用求异或来替代。

异或的本质是模二加,效果是相同为1,相异为0。

对于x = 10101,想要用异或来达到按位取反的效果,就得找出一个特殊的数。令这个数为y,有:

    10101
^         y
_________
    01010

可以发现,y只能是11111,即和x的二进制位数相等的全1。

即若x为一个32位的数,则有 ~x = x ^ 0xffffffff。

 

写代码的时候出现了一些“奇怪”的事情。在vc6.0中有:

;int a = 3;
mov         dword ptr [ebp-0Ch],3

;int b = a ^ 0xffffffff;
00405027   mov         ecx,dword ptr [ebp-0Ch]
0040502A   xor         ecx,0FFh
0040502D   mov         dword ptr [ebp-14h],ecx

源代码给的是0xffffffff,但汇编代码中出现是0xff,只有8位,而且计算结果是对的。

如果只是让a和0xff相异或的话,结果肯定不对。

这里把源代码的0xffffffff换成-1,则有:

;b = a ^ -1;
mov         ecx,dword ptr [ebp-0Ch]
xor         ecx,0FFh
mov         dword ptr [ebp-14h],ecx

看来这里应该是用0xff代表-1,并对0xff进行了扩展变为0xffffffff,否则结果不对。

但是源代码直接写0xff或0xffff看来是不行的。

以上是关于用异或代替按位求反的主要内容,如果未能解决你的问题,请参考以下文章

用异或操作实现的交换函数用以实现数组逆置中须要注意的问题

matlab可以实现按位操作吗?

C语言异或运算会自动转化成2进制?

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

leetcode 389. Find the Difference 牛人用异或 或者 求和 解决,很简单。

位运算常用操作总结位运算应用口诀清零取反要用与,某位置一可用或若要取反和交换,轻轻松松用异或移位运