簡體   English   中英

僅使用按位運算符實現邏輯否定(除了!)

[英]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,映射-1001

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM