Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 比较;如果介于“之间”;使用位运算符而不是逻辑运算符_C_Binary_Compare_Bit Manipulation - Fatal编程技术网

C 比较;如果介于“之间”;使用位运算符而不是逻辑运算符

C 比较;如果介于“之间”;使用位运算符而不是逻辑运算符,c,binary,compare,bit-manipulation,C,Binary,Compare,Bit Manipulation,好吧,我知道这是一个相当卑鄙的任务,我从中做了噩梦,但也许..我会破解代码,感谢你们中的某个人 我想用位运算符比较数字是否在0和10之间。事情就是这样。。它介于0和10之间,而不是例如介于0和2、0和4、0和8之间,依此类推 0-4位数字/二进制表示的参考。(小恩迪安) 0 0 11 210 3 11 4100 5101 6110 7111 81000 91001 1010 111011 121100 131101 141110 151111 试着弄清楚 如果((var&4)>>var)+(

好吧,我知道这是一个相当卑鄙的任务,我从中做了噩梦,但也许..我会破解代码,感谢你们中的某个人

我想用位运算符比较数字是否在0和10之间。事情就是这样。。它介于0和10之间,而不是例如介于0和2、0和4、0和8之间,依此类推

0-4位数字/二进制表示的参考。(小恩迪安)

0 0

11

210

3 11

4100

5101

6110

7111

81000

91001

1010


111011

121100

131101

141110

151111


试着弄清楚
如果((var&4)>>var)+(var&10))

我尝试仅使用位运算符来解决它(无加法

如果数字(
v
)超出0-10(包括0-10)范围,则以下表达式将计算为非零:

(v & (~0xFU)) |
( ((v >> 3) & 1U) & ((v >> 2) & 1U) ) |
( ((v >> 3) & 1U) & ((v >> 1) & 1U) & (v & 1U) )
如果数字大于15,则第一行为非零(设置任何高于前四位的位)。如果在低位4位中,第二行在12和15之间(含12和15),则第二行为非零。如果低4位中的数字为11或15,则第三行为非零

问题中不清楚,但如果要测试的数字限制在0-15(仅低4位)范围内,那么这里可能会有更好的结果:

  ((~(v >> 3)) & 1U) |
( ((~(v >> 2)) & 1U) & (( ~v      ) & 1U) ) |
( ((~(v >> 2)) & 1U) & ((~(v >> 1)) & 1U) )
如果数字介于0和7之间(含0和7),则第一行为1。如果数字是0、2、8或10中的一个,则第二行是1。如果数字是0、1、8或9中的一个,则第三行是1。如果数字介于0和10之间(含0和10),则表达式为1。与此解决方案相关,您还可以查看,它可以帮助生成这些解决方案(也可以用来证明这里没有更简单的解决方案)


我不认为我可以以合理的方式仅使用位运算符来严格地。然而,如果你可以使用加法,它会变得简单得多,正如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
((1<<11) << ~v) | (v & ~15)

可以使用,如果输入不在范围内,该值也非零。

是否有最小或最大可能输入?只有一个变量可以是任何值。确定。所以你的第一步可能是确定它是1-15。所以你可以按位加15,这可以排除所有大于15的。这是一个开始:)。这些面试问题的规则从来都不清楚。你能用
==
吗?你能用
|
吗?你能用三元运算符吗?你能用
返回
?@pat-umm。。就像我说的,不使用逻辑运算符,只使用位运算符。您不能使用返回。第二行对于4到15之间的任何数字似乎都是非零的。正如我在顶部提到的,它返回的是相反的结果!(如果超出范围,则为非零)。我不认为这是合理的,否则只使用按位运算符,因为屏蔽15以上的范围不是一件好事(有一组移位是可能的,请参阅我链接的位旋转黑客页面)。同时,我添加了一个4位数字的解决方案,它可能是干净和正确的。我认为我现在还没有从宇宙中钻出足够的能量来理解这个旋转的终极googolplexian orbitarium黑客。但是我会再次测试你的代码,如果真的不添加代码就能完成任务,那么我认为它会更好。但是。。要做的操作越多,速度就会比pat的代码慢。该死,我没有注意到user3386109提到的内容。需要注意的是:不要在没有三次验证它是否给出预期结果的情况下编写混乱的逻辑。并测试它。不管怎样,我用卡诺图检查了这些东西,并且(在修复了这些东西之后)它还强调了只有按位运算是没有更简单的方法的。这里有一个例子,难道没有一种方法可以使它在0-10的范围内吗?我不明白,我给出的测试范围为0-10的所有例子我认为可能都有效。我明天会试试看,因为现在我的状况非常糟糕。允许使用算术和位比较运算符<代码>==!=!&&&|<>。很抱歉,我也想键入移位运算符
>
是!它是这样工作的。如果不是
v+5
部分,它也会更快,并且会在实际操作中建议它,而不是逻辑比较。干得好!你一定是个机器人什么的。
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));
}
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));
}