-5

我是 C 新手,正在学习按位运算符在 CI 中的工作方式,想检查是否设置了最重要的地址

  int main()
  {

   int addr=0x0fffffff;

   if(addr&0x80)
   {
      Printf("Bit is set");
   }
    else
     printf("Bit is not set");
     return 0;
   }

编辑:我希望 0x80 表示为 1000 0000 0000 0000 0000 0000 0000 0000 ,我在过去见过这样的实现,不需要使用某些宏编写所有位但无法在哪里回忆起它?

4

4 回答 4

2

您的代码 int addr=0x0fffffff; 并且 if(addr&0x80) 导致此条件始终为真。

0x0fffffff  => 0000 1111 1111 1111 .... 1111 1111
where 0x80  =>                          1000 0000
-------------------------------------------------
bitwise AND                             1000 0000 -> non zero means true!
于 2013-10-05T08:02:24.163 回答
1

c每个non zero值都是true。所以你的条件将是真实的。

您的状况将评估为10000000b = 128 = true

于 2013-10-05T08:02:17.753 回答
1

您可以使用掩码 ~(~0U >> 1) 检查是否设置了最高有效位。这是一些改编自您的代码:

#include <stdio.h>

int main() {
    int addr=0x0fffffff;
    unsigned int mask = ~(~0U >> 1);

    if (addr & mask) {
        printf("Bit is set");
    }
    else
        printf("Bit is not set");
    return 0;
}

由于您是 C 新手,因此掩码可能看起来有点奇怪,所以让我们看看这里发生了什么:

~0U 是一个无符号数,每个位都设置为 1:一元 ~ 运算符否定 0 上的每个位,从而使每个位都为 1。 ~0U >> 1 将它全部向右移动一个位置,所以现在你有 (on 32位机器):

01111111111111111111111111111111

再次否定它,即 ~(~0U >> 1),产生:

10000000000000000000000000000000

所以现在你有一个只设置了最高有效位的数字,这被用作测试其他数字的掩码。

使用这种结构是可移植的,因为您不依赖于数字的大小。~(~0U >> 1) 无论 int 中有多少位,都将始终有效。

该数字被声明为无符号数,因为右移运算符会导致常规整数中的符号扩展,我们不希望这样。对于无符号数,右移总是插入前导 0。

于 2013-10-05T08:33:20.557 回答
0

if(addr&0x80)  

条件addr&0x80成立(返回一个非零值到if),它相当于

if( a nonzero value) // any nonzero value treated as true

这就是它打印的原因Bit is set

于 2013-10-05T07:58:16.033 回答