簡體   English   中英

比較“if between”與按位運算符而不是邏輯運算符

[英]Compare “if between” with bitwise operators instead of logical

好吧,我知道這是一個非常卑鄙的任務,我從中做了噩夢,但也許..我會破解那些代碼感謝你們。

我想用比特運算符比較數字是否在0到10之間。 那東西..它在0到10之間,而不是例如在0和2,0和4,0和8之間等等。

帶有0-4位的數字/二進制表示的參考。 (小端)

0 0

1 1

2 10

3 11

4 100

5 101

6 110

7 111

8 1000

9 1001

10 1010


11 1011

12 1100

13 1101

14 1110

15 1111


試圖找出if(((var&4)>> var)+(var&10)之類的東西

我嘗試僅使用按位運算符( 無添加 )來解決它。

如果數字( v )超出0-10范圍,則下面的表達式將變為非零:

(v & (~0xFU)) |
( ((v >> 3) & 1U) & ((v >> 2) & 1U) ) |
( ((v >> 3) & 1U) & ((v >> 1) & 1U) & (v & 1U) )

如果數字大於15(第一行高於設置的前四位),則第一行非零。 如果在低4位中它在12和15之間,則第二行是非零的。 如果在低4位中數字為11或15,則第三行非零。

在問題中不清楚,但如果要測試的數量限制在0到15之間的范圍(只有低4位),那么這里有更好的東西:

  ((~(v >> 3)) & 1U) |
( ((~(v >> 2)) & 1U) & (( ~v      ) & 1U) ) |
( ((~(v >> 2)) & 1U) & ((~(v >> 1)) & 1U) )

如果數字介於0和7之間,則第一行為1。 如果數字是0,2,8或10中的一個,則第二行是1.如果數字是0,1,8或9中的一個,則第三行是1.因此如果數字在0和0之間,則表達式為OR 10個包含。 關於這個解決方案,你也可以查看卡諾圖 ,它可以幫助生成這些(也可以用來證明這里沒有更簡單的解決方案)。

我認為我不能以合理的方式嚴格使用按位運算符 但是,如果您可以使用添加,那么隨着Pat的解決方案顯示它會變得更加簡單。

假設允許添加,則:

(v & ~0xf) | ((v+5) & ~0xf)

如果v超出范圍,則非零。 第一項測試v是否在0..15范圍之外,第二項測試不需要的11, 12, 13, 14, 15在0..15范圍之外。

當允許添加並且范圍是0..15時,一個簡單的解決方案是

(v - 11) & ~7

當v在0..10范圍內時,它是非零的。 改為使用輪班,你可以使用

(1<<10) >> v

如果輸入在0..10范圍內,這也是非零值。 如果輸入范圍不受限制且移位計數為模32,就像在大多數CPU上一樣,您可以使用

((1<<11) << ~v) | (v & ~15)

如果輸入不在范圍內,那么它是非零的(相反的情況很難,因為只有bitops很難用v == 0)。 如果允許其他算術運算,那么

v / 11

可以使用,如果輸入不在范圍內,它也是非零的。

bool b1 = CheckCycleStateWithinRange(cycleState, 0b0, 0b1010); // Note *: 0b0 = 0 and 1010 = 10

bool CheckCycleStateWithinRange(int cycleState, int minRange, int maxRange) const
{
   return ((IsGreaterThanEqual(cycleState, minRange) && IsLessThanEqual(cycleState, maxRange)) ? true : false );
}

int IsGreaterThanEqual(int cycleState, int limit) const
{
   return ((limit + (~cycleState + 1)) >> 31 & 1) | (!(cycleState ^ limit));
}

int IsLessThanEqual(int cycleState, int limit) const
{
   return !((limit + (~cycleState + 1)) >> 31 & 1) | (!(cycleState ^ limit));
}

暫無
暫無

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

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