#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位二进制数但我失败了...
答案 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 ;
}