![](/img/trans.png)
[英]What is the difference between bitwise and logical operators inside conditional statements in C?
[英]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.