C 错误使用状态条件

C 错误使用状态条件,c,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 & 0x400000

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

这段代码工作不正常,我不知道为什么。有人帮忙吗?提前感谢

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

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

<代码> >(ReValue&(1)P>如果您要测试<代码>第二十五位,则<代码> 0x400万不是正确的文字,取决于您认为哪个位是起始位,那么您正在测试位<代码> 26 <代码>或<代码> 27 < /代码> .< 当然,不使用手工计算的文字,更容易的方法是使用一个位元移位,取决于你所考虑的起始位,其中一个应该做你需要的:

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

if(!(regVal&(1查看移位运算符:

差不多

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;
}
#包括
#包括
int getBitValue(无符号int num、无符号int pos){
返回((num>>pos)&0x1);
}
int main(){
无符号整数编号=0xD2009010;
printf(“值=0x%X\n”,num);
写(1,“二进制:”,8);
对于(inti=(sizeof(num)*8);i>=0;--i){
if(getBitValue(num,i))
写(1,“1”,1);
其他的
写(1,“0”,1);
}
写入(1,“\n”,1);
printf(“第25位:%d\n位于索引25(第26位):%d\n”,
getBitValue(num,24),
getBitValue(num,25));
返回0;
}

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

如果您的代码正是您编写的代码,则
位为…;
无效C。如果这是问题,请使用
puts(“位为…””);


关于条件,应该使用
if(!(regVal&0x1000000))
。这就是
1的值。你期望它做什么?首先,它是什么平台?我不希望魔法常量指向有效内存…什么都不做。什么是regAddress?regAddress没有在任何地方使用。@Jite:没错,但当代码甚至没有编译时我就失去了兴趣-OP没有测试它。你确定
0x4000000
正在测试
25th
位吗?我想你需要
0x1000000
。哎呀,你写了25th…这是第24位…!阿贝伦基是对的,沙菲克也是。如果你使用数字(如第4位),我习惯用数字而不是顺序(第0位而不是第一位等)调用位然后位从0开始。这是一个C约定。如果使用顺序(第一、第二等)第一位是0位,第二位是1位等等。是的@user2568437,我想强调的是,第二十五位不必有索引25,这有时会有点混乱。通常情况下,虽然第一位有索引0,所以第二十五位有索引24。我应该澄清我的意思:位号(第一,第二等)不必与索引相同。当执行位移位时,它是移位数,因此要达到第二十五位,必须移位24次。如果要使用索引25设置位,则需要移位25次。@Jite-Hmmm,不太清楚,或者我不明白,但我已修改以删除文本建议。您的代码更改位移位是正确的第五位。唯一不清楚的是作者是否要更改索引25处的位或第25位。我相应地更改了代码,但问题仍然存在。我检查了创建的汇编代码,似乎编译器正在使用LSL R1,R1,#6将位号25移动到MSB位置,然后检查该数字是否为正。出于某种原因l尽管MSB现在是1(对于上面的示例),但CPU将其处理为0。非常奇怪,请注意,您在最初的问题中表示“此代码工作不正常”,现在表示“问题继续”。但您并没有说实际发生了什么!您应该包括
regVal
的确切值,以及您期望发生的事情的完整描述。
if ((yourVal >> 25) & 0x1)
#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;
}