1. 程式人生 > >用異或代替按位求反

用異或代替按位求反

進制 code vc6.0 代碼 xor 想要 意思 6.0 div

按位取反,意思是原來的每一位,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看來是不行的。

用異或代替按位求反