2013-10-30 54 views
0

我需要從兩個互補轉換爲符號 - 量值僅使用運營商轉換補簽署幅度

! ~ &^| + << >> 

我的辦法是找標誌在C: int sign = !(!(a>>31));

基本上,if sign == 1 。我想翻轉數字並加1,否則只是想顯示數字。

的事情是我不能使用任何循環,if語句等 這就是我的工作:

int s_M = ((((a+1)>>31)^sign)+1)&sign; 

有什麼建議?

+0

歡迎SO。您可以使用代碼格式和反引號來對代碼進行格式化以便於閱讀。 – span

+0

可以使用三元運算符嗎? – niko

+0

就是這樣,我做不到。這就是爲什麼我需要使用我所擁有的技巧。我不能使用&&或||只是&或| – user2938343

回答

0

當您將轉換爲2時,您應該減1,而不是添加。

0

我不能完全確保輸出應該是什麼,但是要獲得你可以做這樣的事情的大小:

int m = (a^(a>>31)) + sign; 

基本上,換擋負數31位到右側將會使這一切1或0xffffffff,然後您可以使用它來對輸入數字進行異或並使其成爲正數。正如您正確指出sign需要添加然後在這種情況下的正確結果。

如果輸入數字是正數開始,則移位結果爲零,因此xor不執行任何操作。在這種情況下添加sign也不會執行任何操作,因此會導致輸入數字。

0

爲了讓你可以使用屏蔽操作

int last_bit = 32 bit integer & 0x80000000 
    o/p may be 0 or 0x80000000  

最後一位如果0只顯示給定數量的其他必須執行以下操作中符號的振幅

1來表示)減去1從

2)執行1S對所得補充(該數是否定~

3)因爲你限制不使用-運營商設定的最終數量

I mean (~ (num -`1)) | 0x7fffffff 

的最後一位。執行2's complement on -1並將其添加到num

To put it simple in one line 
num & 0x80000000 ? printf("%d",(~(num+((~1)+1))) | 0x7fffffff) : printf("%d",num) ; 
1

http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs

int const mask = v >> 31; 
unsigned int r = (v + mask)^mask; 

給人的絕對值(幅度)。如果您要添加的符號位後面簡單地掩蓋和或第32位:

unsigned int s_M = r | (v & 0x80000000); 

或者,如果你正在尋找一個班輪:

unsigned int s_M = ((v + (v >> 31))^(v >> 31)) | (v & 0x80000000); 
+0

爲什麼'const const中的'mask = v >> 31;'? – chux

+0

的事情是,如果我有數字0x80000001它應該被轉換爲-1而不是-2147483647。 – user2938343

+0

@chux我從Bit Twiddling Hacks鏈接中獲得了這個。通過設置const值,我認爲它可以幫助編譯器進行某些優化,儘管我真的不知道。 – OlivierD