读取和更改C uint32_t中的位

时间:2013-11-15 11:38:30

标签: c integer bit uint32-t

我正在使用此代码

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'的值。

帮助表示赞赏

4 个答案:

答案 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;