[英]Implementing logical negation with only bitwise operators (except !)
~ & ^ | + << >>
~ & ^ | + << >>
是我可以使用的唯一操作
在我繼續之前,這是一個功課問題,我已經堅持了很長時間。
我原來的方法:我認為!x可以用兩個補碼完成,並用它的加法逆做一些事情。 我知道xor可能在這里,但我真的不知道如何處理這個問題。
為了記錄:我也不能使用條件,循環, ==
等,只能使用上面提到的函數(按位)。
例如:
!0 = 1
!1 = 0
!anything besides 0 = 0
假設一個32位無符號int:
(((x>>1) | (x&1)) + ~0U) >> 31
應該做的伎倆
假設x
已簽名,則需要為任何不為零的數字返回0,為零返回1。
在大多數實現中,有符號整數的右移通常是算術移位(例如,符號位被復制)。 因此,右移x
乘以31,其否定為31.其中一個將是負數,因此右移31將為0xFFFFFFFF(當然如果x = 0則右移將產生0x0,這是你想要的) 。 你不知道x或它的否定是負數,所以只是'或'它們在一起你會得到你想要的。 接下來加1和你的好。
執行:
int bang(int x) {
return ((x >> 31) | ((~x + 1) >> 31)) + 1;
}
以下代碼將任何1位復制到所有位置。 這會將所有非零映射到0xFFFFFFFF == -1
,而將0
保留為0
。 然后它添加1,映射-1
到0
和0
到1
。
x = x | x << 1 | x >> 1
x = x | x << 2 | x >> 2
x = x | x << 4 | x >> 4
x = x | x << 8 | x >> 8
x = x | x << 16 | x >> 16
x = x + 1
對於32位有符號整數x
// Set the bottom bit if any bit set.
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
x ^= 1; // Toggle the bottom bit - now 0 if any bit set.
x &= 1; // Clear the unwanted bits to leave 0 or 1.
假設例如8位無符號類型:
~(((x >> 0) & 1)
| ((x >> 1) & 1)
| ((x >> 2) & 1)
...
| ((x >> 7) & 1)) & 1
你可以做~x&1,因為它為0產生1,其他所有產生0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.