Tre*_*vin 6 c logic bit-manipulation
我有一个32位的int我一次只能访问它8位.我需要找出每个偶数位是否设置为0,如果为真,则返回0,否则返回1.
到目前为止,我将使用转换为4位,8位变量来拆分我的int.int a,b,c,d
现在我要不要他们所以现在我将测试该位是否设置为1而不是0.要测试它是否设置为1我将和01010101.
现在我不知道如何判断每个偶数位是否设置为1.我不能使用if/for/while循环或任何条件语句并且需要使用按位运算符.有任何想法吗????
好的,所以你创建了一个位掩码.(01010101)
if ((value & bit_mask) == bit_mask)
Run Code Online (Sandbox Code Playgroud)
那么你知道,这是坐落在每个位bit_mask中也设置value.
您想要检查每个第二位是否设置为0.(未设置为1,因为我上面的错误答案检查)
有两种同样有效的方法:我们使位掩码相反(10101010)
然后使用OR运算符:
if ((value | bit_mask) == bit_mask)
Run Code Online (Sandbox Code Playgroud)
这将检查零中的每个位bit_mask为零value.
第二种方法是使位掩码相同(01010101)并使用AND运算符:
if ((value & bit_mask) == 0)
Run Code Online (Sandbox Code Playgroud)
这将检查其中的每个位bit_mask是否为零value.
编辑:我对原来的问题感到困惑,并在否定中遵循OP - 所以基本上这解决了相反的问题。Andrew Sheperd 编辑后的解决方案从最初的问题开始,一步解决。Rudy Velthuis 还提供了一种有趣的方法。
如果您的字节值 AND 01010101 == 01010101 掩码选择的所有位在原始字节值中均为 1。
在某种伪 C 中:
unsigned char mask = 0x55;
if ((byteval & mask) == mask) {
printf ("all set");
}
Run Code Online (Sandbox Code Playgroud)
或基于异或的稍微更奇特的变体
unsigned char mask = 0x55;
if (!((byteval & mask) ^ mask)) {
printf ("all set");
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,if对于最终结果来说,很容易摆脱它......