C语言中用指定位运算符实现范围检查的可行性问询
用位运算判断cycleState范围的实现正确性分析
首先直接给出结论:你提到的示例代码完全不正确,根本无法实现cycleState在400到7936之间的范围检查,原因如下:
示例代码的逻辑问题
示例代码是:
bool b1 = (cycleState & 0b1111100000000); // 0b1111100000000 = 7936
这个代码的逻辑是:只要cycleState的二进制位中,与7936的置位位(也就是第8到12位,对应28到212)有任何重叠,结果就非0(即b1为true)。但这个逻辑完全不符合范围要求:
- 下限判断失效:比如
cycleState=256,它的第8位是1,和7936相与结果为256≠0,b1会返回true,但256明显小于400,不在目标范围内。 - 上限判断失效:比如
cycleState=8000,它的二进制是0b1111101000000,和7936相与结果为7936≠0,b1返回true,但8000已经超过了7936的上限。
正确的单行位运算实现(仅用指定运算符)
要实现严格的范围检查,我们需要同时满足cycleState >=400和cycleState <=7936两个条件,用指定位运算符可以这样写:
bool isValid = !(cycleState & ~0b1111100000000) && !( ((cycleState & 0b111111111) ^ 0b110010000) & ~(cycleState & 0b111111111) );
拆解一下逻辑:
!(cycleState & ~0b1111100000000):检查cycleState是否不超过7936。~0b1111100000000会把7936之外的所有位置为1,只要cycleState有这些位为1,说明它超过了7936,取反后就为false。!( ((cycleState & 0b111111111) ^ 0b110010000) & ~(cycleState & 0b111111111) ):检查cycleState是否不小于400。这里先取cycleState的低9位(因为400是9位二进制数),通过异或和按位与的组合,判断低9位是否大于等于400;如果cycleState的高位(第9位及以上)有值,那它肯定大于400,这部分逻辑也被包含在内。
内容的提问来源于stack exchange,提问作者Abhijeet Parmar
相关产品推荐
相关产品推荐

