我正在使用此代码
int get_bit(int n, int bitnr) {
int mask = 1 << bitnr;
int masked_n = n & mask;
int thebit = masked_n >> bitnr;
return thebit;
}
void printbits(uint32_t bits) {
int i;
for (i = 0; i < 32; i++)
printf("%d", get_bit(bits, i));
printf("\n");
}
获取并打印uint32_t的位, 在另一个函数中这个代码
uint32_t bits= 0;
bits|= 1<< 0;
将最高位(最左侧)从0更改为1.
问题是当使用printbits函数打印位时,它会正确打印它们,但是当使用printf("%#x", bits);
时,我得到位的十六进制值,就好像它们是从右到左读取一样!
所以printbits给了'10000000000000000000000000000000' 但打印的十六进制值是'00000000000000000000000000000001'的值。
帮助表示赞赏
答案 0 :(得分:2)
这一行:
bits |= 1<< 0;
更改最低有效位( LSB )。 1 << 0
等于1
,这不是很重要:)。
但是,如果你这样做:
bits |= 1 << 31;
或
bits |= 0x80000000;
您实际上会更改最重要的位( MSB )。
您的代码实际上是从右到左打印数字。您必须将循环更改为减量。
for (i = 31; i >= 0; i--)
如果以错误的方式打印对你来说很好(谁知道......),试试这个:
uint32_t n = 41;
while (n) {
printf("%d", n & 1);
n >>= 1;
}
这可以很容易地使用递归函数以正确的方式进行打印:
void printbits(uint32_t n) {
if (n) {
printbits(n >> 1);
printf("%d", n & 1);
}
}
此算法适用于任何经过微小修改的基础。
答案 1 :(得分:1)
此代码bits|= 1<< 0;
设置的最小值不是整数中的最高位。您的get_bit
函数也是如此 - 它从右到左对这些位进行编号。
答案 2 :(得分:1)
(1 << 0)
是最少有效位。 (1 << 31)
将是最重要的一点。
您的打印功能是按升序打印位(错误方式)。您需要撤销for
循环:
for (i = 31; i >= 0; i--)
答案 3 :(得分:0)
这改变了右边的第一个数字(最不重要的位):
uint32_t bits= 0;
bits|= 1<< 0;
使用类似:
uint32_t bits= 0;
bits |= 0x8000;