在c二进制文件中,测试以查看数字是否在范围内

这是我无法弄清楚的谜题的一部分。 该function包含三个输入。 第一个是int,第二个是下限,第三个是上限。 我需要测试以查看第一个数字是否在包含的下限和上限之内。

如果它在范围内则返回1,否则返回0.捕获是我只能使用

! ~ & ^ | + <> 

操作,并且只有20个的组合。此外,只能使用int变量,而不能使用if语句,循环或函数调用。

 Range(int x, int lower, int upper){ //... some code here return retVal; } 

显然我理解这里的逻辑。 如果((x> = lower)&&(x <= upper))返回1; 唯一的问题是我不能使用if语句,,==或&&。

我喜欢你的这些谜题! 为此,你会希望有类似的东西,

好的在这个上是抽象的,你会想要有2个变量。

第一个变量(让我们称之为blarg)你需要设置上限并添加翻转的x。 现在你想要添加一个到blarg并翻转它。

你的第二个变量(让它叫它保持)将x加到翻转的下限; 之后添加1来保持并翻转它。

设blarg =到blarg加hold; 将blarg从31转移到右边。 和它与1。

应该是你想要的。

您可以使比较谓词x < y (如果为真则返回-1,如果为假则返回0),如下所示:(参见Hacker's Delight,第2章,子章节比较谓词)

 ((x - y) ^ ((x ^ y) & ((x - y) ^ x))) >> 31; 

你没有列出减法,但你可以用~(~x + y)模拟x - y

使用其中两个谓词,使1 & ~((x < lower) | (upper < x))

这显然假定2的补码负数和32位整数与溢出包装。 所以这不是便携式的,但这是这种技巧的常态。


根据要求,这总是:

 int in_range(int x, int lower, int upper) { int p = ((x - lower) ^ ((x ^ lower) & ((x - lower) ^ x))) >> 31; int q = ((upper - x) ^ ((upper ^ x) & ((upper - x) ^ upper))) >> 31; return 1 & ~(p | q); } 

它仍然有减法,如果你真的想要它们,它们是无足轻重的。

通过使用>=<=谓词(也可以在Hacker's Delight中找到),可以缩短一点点。

这是我的网站说它是正确的 。


这是一种使用较少操作的方法,请记住我们不能使用减法:

 int p = (x | ~upper) & ((x ^ upper) | (~upper + x)); int q = (lower | ~x) & ((lower ^ x) | (~x + lower)); return 1 & ((p & q) >> 31); 

它使用HD的<=谓词,它的纯forms看起来像(x | ~y) & ((x ^ y) | ~(y - x))

这是我的网站说它是正确的 。

这是一个简单的解决方案

 int foo(int num, int upp, int low){ return (~((~(upp + ~num + 1)) ^ (~(num + ~low + 1))) >> 31) & 1; } 

做这个。 我将讲述可以使用的逻辑。

 a=~x+1 //gives -x b=lower+a //lower-x c=~upper+1 //gives -upper d=x+c //x-upper b=b&0x80000000; //get the msb which is 1 if -ve number d=d&0x80000000; return ((b&d)|(!(x^lower))|(!(x^upper))); //& results in +ve only if both b & d are +ve