我正在尝试编写代码来打印数字的二进制表示。这是我的尝试:
#include <stdio.h>
void getBinary(int num);
int main(void) {
int num = 2;
getBinary(num);
return 0;
}
void getBinary(int num) {
int mask = 1 << 31, i;
int temp;
for (i = 31; i >= 0; i--) {
temp = num & mask;
if (temp > 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
这不起作用。如果我使num = 2,我的输出将是... 0011。这就是我给出的答案:
void getBinary(int);
int main()
{
int num=0;
printf("Enter an integer number :");
scanf("%d",&num);
printf("\nBinary value of %d is =",num);
getBinary(num);
return 0;
}
/*Function definition : getBinary()*/
void getBinary(int n)
{
int loop;
/*loop=15 , for 16 bits value, 15th bit to 0th bit*/
for(loop=15; loop>=0; loop--)
{
if( (1 << loop) & n)
printf("1");
else
printf("0");
}
}
这将给出正确的输出。为什么?我的代码与此之间有什么不同。是不是他们用更少的步骤做解决方案做同样的事情?
答案 0 :(得分:2)
#include <stdio.h>
void getBinary(int num);
int main(void) {
unsigned int num = 2;
getBinary(num);
return 0;
}
void getBinary(int num) {
unsigned int mask = 1 << 31;
int i;
unsigned int temp;
for (i = 31; i >= 0; i--) {
temp = num & mask;
if (temp > 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
对于那些好奇的人来说,这是正确的答案。只需使面具无符号。
答案 1 :(得分:0)
您在代码中遇到一些问题:
INT_MIN
由于带符号的算术溢出而调用未定义的行为。在您的平台上,它很可能产生值temp > 0
,它具有预期的位配置但是为负。
num < 0
, temp
可能会失败,因为符号位也会使mask
为负。
当值为负时将mask
向右移动具有实现定义结果:在您的平台上它复制符号位,因此unsigned int
将没有预期的单个位,但所有位都设置在当前位之上。这解释了观察到的行为。
您应该在getBinary
,num
和temp
的函数mask
中使用#include <stdio.h>
void getBinary(unsigned int num);
int main(void) {
unsigned int num = 2;
getBinary(num);
return 0;
}
void getBinary(unsigned int num) {
unsigned int mask = 1U << 31;
unsigned int temp;
for (int i = 31; i >= 0; i--) {
temp = num & mask;
if (temp != 0)
printf("1");
else
printf("0");
mask = mask >> 1;
}
printf("\n");
}
类型来获得正确的行为。
以下是您的代码的更正版本:
int
建议的解决方案仅打印16位,这可能是也可能不是规范。如果int
类型大于16位,则位移不会溢出,一切都很好。如果1 << 15
有16位,void getBinary(unsigned int num) {
for (int shift = 32; shift-- > 0;) {
putchar('0' + ((num >> shift) & 1));
}
putchar("\n");
}
会调用未定义的行为,因此解决方案不是严格正确的,但会在大多数当前平台上运行。
这是一个更简单的解决方案:
shift
将16
初始化为section.contact form textarea {
line-height: 98.5px !important;
}
,仅打印低16位。