[英]Implementing “logical not” using less than 5 bitwise operators
作為我的CS課程的一部分,我最近完成了非常受歡迎的“數據實驗室”任務。 在這些分配中,您應該使用盡可能少的操作在C中實現簡單的二進制操作。
對於那些不熟悉“數據實驗室”的人,可以快速了解規則:
任務是通過僅使用以下運算符來實現一個不稱為'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.