如何将8位二进制数转换为6位?

时间:2018-04-16 19:15:44

标签: c

#include <stdio.h>

int main()
{
    int x;

    setvbuf(stdout, NULL, _IONBF, 0);

    printf("type a integer.");
    scanf("%d", &x);

    printf("%d : ", x);

    printf("%d", x & 0x80 ? 1 : 0); x <<= 1;
    printf("%d", x & 0x80 ? 1 : 0); x <<= 1;
    printf("%d", x & 0x80 ? 1 : 0); x <<= 1; 
    printf("%d", x & 0x80 ? 1 : 0); x <<= 1;
    printf("%d", x & 0x80 ? 1 : 0); x <<= 1;
    printf("%d", x & 0x80 ? 1 : 0); x <<= 1;
    printf("%d", x & 0x80 ? 1 : 0); x <<= 1;
    printf("%d", x & 0x80 ? 1 : 0);

    return 0;
}

这是一个可以将整数转换为8位二进制数的代码,我试图让它打印6位二进制数但我失败了...

3 个答案:

答案 0 :(得分:2)

在每个步骤中,上面的代码在x和0x80之间进行逻辑和操作。在二进制0x80中是10000000.所以在每个操作中,如果x的当前最高有效位是1或0,我们得到。在每次迭代中,x右移到1位。所以经过所有的操作。我们得到8位二进制的初始整数。要获得6位的值,您需要在x和0x20(二进制100000)之间进行逻辑和操作。

答案 1 :(得分:0)

您的代码屏蔽了数字的第8位,这会引入移位,并产生错误的结果。

我只是使用shift来生成循环中的掩码:

#include <stdio.h>

int main()
{
    int x,i;

    printf("type an integer.");
    scanf("%d", &x);

    for (i=0;i<6;i++)
    {
       printf("%d", (x & (1<<(5-i))) != 0);
    }
    return 0;
}

或在循环中调整您的尝试&amp;正确的掩码位置(更改x),并使用惯用整数来布尔双重否定技巧:

for (i=0;i<6;i++)
{
   printf("%d", !!(x & 0x20));
   x <<= 1;
}

答案 2 :(得分:0)

移动掩码比修改原始值更好 - 这是一个不必要的 destrictove 算法,因为这是一个已知值,你可以简单地使用常量:

printf("%d", x & 0x20 ? 1 : 0);
printf("%d", x & 0x10 ? 1 : 0); 
printf("%d", x & 0x08 ? 1 : 0);
printf("%d", x & 0x04 ? 1 : 0); 
printf("%d", x & 0x02 ? 1 : 0); 
printf("%d", x & 0x01 ? 1 : 0);

或使用循环和_alking-one mask:

unsigned mask = 0x20 ;
while( mask != 0 )
{
    printf("%d", x & mask ? 1 : 0);  
    mask >>= 1 ;   
}