我需要從兩個互補轉換爲符號 - 量值僅使用運營商轉換補簽署幅度
! ~ &^| + << >>
我的辦法是找標誌在C: int sign = !(!(a>>31));
基本上,if sign == 1
。我想翻轉數字並加1,否則只是想顯示數字。
的事情是我不能使用任何循環,if語句等 這就是我的工作:
int s_M = ((((a+1)>>31)^sign)+1)&sign;
有什麼建議?
我需要從兩個互補轉換爲符號 - 量值僅使用運營商轉換補簽署幅度
! ~ &^| + << >>
我的辦法是找標誌在C: int sign = !(!(a>>31));
基本上,if sign == 1
。我想翻轉數字並加1,否則只是想顯示數字。
的事情是我不能使用任何循環,if語句等 這就是我的工作:
int s_M = ((((a+1)>>31)^sign)+1)&sign;
有什麼建議?
當您將從轉換爲2時,您應該減1,而不是添加。
我不能完全確保輸出應該是什麼,但是要獲得你可以做這樣的事情的大小:
int m = (a^(a>>31)) + sign;
基本上,換擋負數31位到右側將會使這一切1或0xffffffff
,然後您可以使用它來對輸入數字進行異或並使其成爲正數。正如您正確指出sign
需要添加然後在這種情況下的正確結果。
如果輸入數字是正數開始,則移位結果爲零,因此xor不執行任何操作。在這種情況下添加sign
也不會執行任何操作,因此會導致輸入數字。
爲了讓你可以使用屏蔽操作
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) ;
從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);
爲什麼'const const中的'mask = v >> 31;'? – chux
的事情是,如果我有數字0x80000001它應該被轉換爲-1而不是-2147483647。 – user2938343
@chux我從Bit Twiddling Hacks鏈接中獲得了這個。通過設置const值,我認爲它可以幫助編譯器進行某些優化,儘管我真的不知道。 – OlivierD
歡迎SO。您可以使用代碼格式和反引號來對代碼進行格式化以便於閱讀。 – span
可以使用三元運算符嗎? – niko
就是這樣,我做不到。這就是爲什麼我需要使用我所擁有的技巧。我不能使用&&或||只是&或| – user2938343