错误使用国家条件

时间:2013-07-10 12:08:41

标签: c

我使用以下代码检查位号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;

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

5 个答案:

答案 0 :(得分: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都不对。

答案 1 :(得分: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;
}

答案 2 :(得分:2)

如果您尝试测试25th位,那么0x4000000不是正确的字面值,具体取决于您认为哪个位为起始位,那么您正在测试位2627

当然,不是使用手工计算的文字,而是使用位移的更简单方法,取决于你认为起始位之一,你应该做什么:

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

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

答案 3 :(得分:1)

如果您的代码与您编写的内容完全相同,那么the bit is ...;无效C.如果出现问题,请使用puts("the bit is ...");

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

答案 4 :(得分:0)

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