2017-03-14 121 views
0

我在長時間編寫FitsBits時遇到了一些問題,所以我使用了它,並找到了適合測試程序的解決方案,但我無法弄清楚這意味着什麼。按位操作:FitsBits

問題描述:

fitsBits - 返回1,如果x能夠被表示爲n比特, 二的補碼整數。
= N < = 32個
實例:

fitsBits(5,3)= 0,fitsBits(-4,3)= 1個
法律OPS:! 〜&^| + < < >> 最大OPS:15

一個合適的解決方案是:

int fitsBits(int x, int n) 
{ 
int move; 
move = 32 +(~n+1); 
return !(x^((x<<move)>>move)); 
} 

但我不知道

(X ^((X < <移動) >> move))

意味着什麼。

我真的需要一些幫助.Thx!

回答

1

此問題與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)) 
+1

謝謝!你真的幫助了我。 – HumbertZhang