我使用以下代码检查位号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;
此代码无法正常工作,我无法弄清楚原因。帮助任何人?提前致谢
答案 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
不是正确的字面值,具体取决于您认为哪个位为起始位,那么您正在测试位26
或27
。
当然,不是使用手工计算的文字,而是使用位移的更简单方法,取决于你认为起始位之一,你应该做什么:
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。