簡體   English   中英

使用少於5個按位運算符實現“邏輯非”

[英]Implementing “logical not” using less than 5 bitwise operators

作為我的CS課程的一部分,我最近完成了非常受歡迎的“數據實驗室”任務。 在這些分配中,您應該使用盡可能少的操作在C中實現簡單的二進制操作。

對於那些不熟悉“數據實驗室”的人,可以快速了解規則:

  • 您不能調用函數,強制轉換或使用控制結構(例如,如果)
  • 您可以分配沒有運營商成本的變量,但只允許使用int)
  • 您使用的運營商越少越好
  • 您可以假設sizeof(int)== 32
  • 負數用2的補碼表示

任務是通過僅使用以下運算符來實現一個不稱為'bang'的邏輯(其中bang(x)返回!x):〜&^ | + << >>

函數原型定義為

int bang(int x)

我能找到的最佳實現(使用5個運算符)如下:

return ((x | (~x +1)) >> 31) + 1

然而,似乎有一種方法可以通過更少的操作員來實現這一目標,因為我在一些德國大學找到了一個結果網站[1],其中兩個人顯然找到了一個少於5個操作員的解決方案。 但我似乎無法弄清楚他們是如何完成的。

[1] http://rtsys.informatik.uni-kiel.de/~rt-teach/ss09/v-sysinf2/dlcontest.html(logicalNeg專欄)

澄清:這不是關於如何解決問題,而是如何用較少的操作來解決問題。

只是輕微作弊:

int bang(int x) {
    return ((x ^ 0xffffffffU) + 1UL) >> 32;
}

是我能想到的只有3個操作的唯一方法。 假設32位int和64位長...

如果您冒昧地假設int加法溢出是明確定義並且包裝(而不是未定義的行為),那么有一個包含四個運算符的解決方案:

((a | (a + 0x7fffffff)) >> 31) + 1

我認為你假設溢出被定義為包裝,否則你的函數((x | (~x + 1)) >> 31) + 1具有x = INT_MIN的未定義行為。

為什么不呢: -

int bang(int x)
{
    return 1 >> x;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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