-4

我正在使用以下代码检查第 25 位的值是 0 还是 1:

volatile unsigned int * regAddr;
unsigned int regval;

regAddress = (unsigned int *) 0xD2009010;   //This is a valid address of register

regVal = *regAddress;   //The return value here is 0xFE008000

if (!(regVal & 0x4000000))     //For the mentioned return value, I thought the condition will be different then 0 and so used '!' to convert the value
    the bit is 0;
else
    the bit is 1;

此代码无法正常工作,我无法弄清楚原因。帮助任何人?提前致谢

4

5 回答 5

5

获得第 25 位的可靠方法是:

if (!(regVal & (1 << 24) ))

或者,如果您愿意:

#define BIT_25 (1 << 24)  // the first-bit, shifted over 24 more times.

if (!(regVal & BIT_25 ))

有几个人提出“第 25 位”是模棱两可的,这取决于您认为 0x01 是第一位还是第零位。

根据您的程序自行决定。
但不管怎样,0x4000000都是不对的。

于 2013-07-10T12:19:20.347 回答
3

看一下班次运算符:

http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Companion/cxx_crib/shift.html

就像是

if ((yourVal >> 25) & 0x1)

应该做你想做的。

例如:打印整数,然后打印第 25 位和第 26 位:

#include <unistd.h>
#include <stdio.h>

int     getBitValue(unsigned int num, unsigned int pos) {
  return ((num >> pos) & 0x1);
}

int     main() {
  unsigned int num = 0xD2009010;

  printf("Value = 0x%X\n", num);
  write(1, "Binary: ", 8);
  for (int i = (sizeof(num) * 8); i >= 0; --i) {
    if (getBitValue(num, i))
      write(1, "1", 1);
    else
      write(1, "0", 1);
  }
  write(1, "\n", 1);
  printf("25th bit: %d\nBit at index 25 (26th): %d\n",
         getBitValue(num, 24),
         getBitValue(num, 25));
  return 0;
}
于 2013-07-10T12:19:41.363 回答
2

如果您尝试测试该25th位,则0x4000000不是正确的文字,这取决于您认为哪个位是起始位,那么您正在测试位2627.

当然,不是使用手工计算的文字,而是使用位移的更简单方法,这取决于您认为其中一个起始位应该满足您的需要:

if( !(regVal & (1 << 24)) )  

或者

if( !(regVal & (1 << 25)) )  
于 2013-07-10T12:19:39.317 回答
1

如果您的代码正是您编写的,则the bit is ...;不是有效的 C。如果这是问题所在,请使用puts("the bit is ...");

关于条件,您应该使用if (!(regVal & 0x1000000)). 这就是 的价值1<<(25-1)。(在我的理解中,0x1 是第一位,依此类推)

于 2013-07-10T12:50:26.483 回答
0

我假设地址 0xD2009010 是您正在读取的寄存器的地址,您正在使用的体系结构具有内存映射寄存器(并且您可能正在编写设备驱动程序,当然不是应用程序,除非您正在为 vxWorks 或 DOS 编写.. ..),那么如果你想测试第 25 位,你应该测试 0x2000000(请记住,位从 0 开始,所以每个半字节上升 4:0、4、8 等,在 6 个 0 之后,你在第 24 位(这将是 0x1000000)。你想要 25,所以这是 0x2000000。

于 2013-07-10T12:21:39.897 回答