2016-01-29 57 views
-1

我寫帶參數的函數的表示:找到N個位長度的二進制補一些

int nbit2s(long int x, long int n){ 

} 

我期待參加64位號x,並找出如果ñ 2位表示位長度是可能的。然而,我僅限於使用按位運算符,並排除使用運算符(例如> = < =和條件語句

例如,nbit2s(5,3)返回0,因爲該表示是不可能的。

我不找任何代碼,但只是想法,到目前爲止我的想法一直是:

  1. 採取第n並將其轉換成它的二進制表示。
  2. 左移二進制表示64的n倍來獲得的MSB和存儲在一個變量移 3.Shift向右64-N以獲得引導位,並存儲在移位
  3. XOR原始數與W,如果1然後是0,然後是假。

我覺得這是沿着正確的路線,但如果有人能夠解釋也許是一個更好的方法來做到這一點,或者我可能犯的任何錯誤,這將是偉大的。

+2

'long int x'只能是32位。推薦'long long'或'uint64_t'。 – chux

+0

我的印象是long int在mac機器上是64位,在windows機器上保持爲32位。 –

+1

我覺得你正在做相同的課程:https://stackoverflow.com/questions/9122636/finding-how-many-bits-it-takes-to-represent-a-2s-complement-using-only-bitwise https://stackoverflow.com/questions/8204075/minimum-bits-required-for-twos-complement-number-representation – viraptor

回答

2

如果我正確理解您的問題,您想確定整數x是否可以用n或更少的位表示爲二進制數。

一個簡單的方法來測試這是使用按位AND運算符來掩蓋所有高於最大值的位,然後查看掩碼整數是否與原始相同。

實施例:

bool nbit2s(uint64_t x, int n) { 
    return (x & (1ULL << n) - 1) == x; 
} 
+0

'1 << n'不能移位64位,因爲'int 1'可能很窄。最好使用'1ULL << n'或類似的 – chux

+0

@chux好的結果 - 更新的答案 –

+0

這隻適用於無符號數字。這個問題包括負面問題。 – viraptor

1

一種用於正數的解決辦法是正好通過n移位。如果它仍然非零,那麼它需要多於n位來表示它。

但是由於參數是有符號的,而且您正在討論2補碼錶示,所以您可能必須將其轉換爲無符號表示形式以避免符號擴展。