此問題與Bitwise operations and shifts重複,用戶要求瞭解相同的代碼。不幸的是我沒有名聲來標記它。
重申Code-Apprentice's答案和AnT's,基於你找到了解決辦法,更說明了一些修改我自己
move = 32 +(~n+1);
這實際上是32間(和大小的不同n的最大值,在這個問題中的整數)和n。
瞭解爲什麼看着兩個補碼有符號整數。在此格式在轉換一個無符號的整數,例如在原來的實例中,5(0101)到-5經由反轉比特和添加一種,
~5 + 1 = -5
或
~(0101) + 1 = 1011
通知如何1011不能配合到3個比特,並且仍然是負數(在2的補負數必須以1)
所以
move = 32 +(~n+1);
實際上
move = 32 - n;
是最後一行實際上是一個線
!(x^((x<<move)>>move));
一些想法,以便讓其分解。
invert the truthiness of
(x xor a number)
where the number is x first shifted left then right amount move
and move is the difference between n and 32.
讓我們再次使用5和3的例子。我們知道移動應該是32-3,所以移動是29.
但是爲什麼左右移動的數量相同?通常,當你看到一些人在代碼中這樣做時,他們試圖「清零」一個數字。在這種情況下,作者沒有這樣做,但是符號擴展。看看下面
例如:
given 0000 0000 0000 0000 0000 0000 0000 0101 = 5
5 << 29 = 1010 0000 0000 0000 0000 0000 0000 0000 = -1610612736
-1610612736 >> 29 = 1111 1111 1111 1111 1111 1111 1111 1101 = -3
筆者使用RSHIFT的執行層面怪癖,如果該號碼開始作爲一個簽名,它保持它的標誌和符號填充爲數字其餘的移動。
注意填充符號的方式(5 >> 29)< < 29不會導致相同的數字,因爲當我們將5移動到32位有符號數的末尾時,它從1開始,因此變爲自己簽名。
下一行是要簡單得多
(x^number)
將是0,如果x ==數量,因爲0 XOR 1 = 1,和1個XOR 1 = 0,和0 XOR 0 = 0。因此,通過該邏輯,當我們顛倒x的感實性,我們正在檢查是否
x == (sign shifted x)
如果5是,比方說,8而不是(1000),我們將簡單地失去了最後一個數字(1),我們會發現,
!(8^0) == false.
如果我們選擇使用一個實際工作的數字(比如說3),因爲3 = 011,而向右移動29將導致第一位爲0,當來回移動時我們將保留3的值,所以我們會發現
!(3^3) == true;
總結功能真的只是做以下
given int x and int n,
check if x == (x shifted left then sign shifted right by (size of int in bits - n))
來源
2017-03-21 17:26:29
snb
謝謝!你真的幫助了我。 – HumbertZhang