用異或代替按位求反
阿新 • • 發佈:2017-06-27
進制 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,0FFhmov dword ptr [ebp-14h],ecx
看來這裏應該是用0xff代表-1,並對0xff進行了擴展變為0xffffffff,否則結果不對。
但是源代碼直接寫0xff或0xffff看來是不行的。
用異或代替按位求反