2

I am using this code

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");
}

to get and print the bits of a uint32_t, and in another function this code

uint32_t bits= 0;
bits|= 1<< 0;

to change the most significant bit (left-most) from 0 to 1.

the problem is when printing bits using the printbits function, it prints them right, but when using printf("%#x", bits); I'm getting the hex value of the bits as if they are read from right to left!

so the printbits gives me '10000000000000000000000000000000' but the hex value printed is the value of '00000000000000000000000000000001'.

Help appreciated

4

4 回答 4

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);
    }
}

该算法适用于任何稍作修改的碱基。

于 2013-11-15T11:44:01.467 回答
1

此代码bits|= 1<< 0;设置整数中的最低而不是最高有效位。您的get_bit函数也是如此 - 它从右到左对位进行编号。

于 2013-11-15T11:42:46.100 回答
1

(1 << 0)最低有效位。(1 << 31)将是最重要的位。

您的打印功能是按升序打印位(错误的方式)。您需要反转for循环:

for (i = 31; i >= 0; i--)
于 2013-11-15T11:42:46.453 回答
0

这改变了右边的第一个数字(最不重要的位):

 uint32_t bits= 0;
 bits|= 1<< 0;

使用类似的东西:

uint32_t bits= 0;
bits |= 0x8000;
于 2013-11-15T11:42:36.600 回答