我遇到过这个程序,将小数字转换成C中的二进制数。我不明白printf语句在这个程序中是如何工作的。
int main()
{
int N;
scanf("%d", &N); // Enter decimal equivalent here
for( int j = floor(log2(N)); j >= 0; j-- ){
printf("%d", (N >> j) & 1);
}
}
答案 0 :(得分:1)
它正在做的是:
j
2^j <= N
j
位开始(从右侧算起)并向右移动......
答案 1 :(得分:1)
让我们举个例子来解决这个问题。假设您输入N = 65。它的二进制表示是 - 1000001.当你给定的代码通过它时,j将从floor(log2(65))开始,这是6.因此,给定的循环将运行7次,这意味着将打印出7个数字(这符合65的二进制表示有7位数的事实。
循环内部 - 每次向右移动数字j位。当1000001向右移动6位时,它变为0000001.如果移位5,则为0000010,依此类推。它下移到0位,这是原始数字。当这些移位的数字中的每一个都用1表示时,只剩下最低有效位(最右边的位)。这个数字可以是0或1。
如果您注意到每个右移将数字除以2.因此,当1000001被移动1以产生0100000时,它是32的二进制表示,实际上是C中的65/2。毕竟,这是某人手动计算数字的二进制表示的方式。每个除以2给出一个数字(从结尾开始)的表示,该数字是0或1。有助于获得0或1。
最后,65变为1000001。
答案 2 :(得分:0)
该代码实际上具有未定义的行为,因为您既没有包含<stdio.h>
,也没有包含<math.h>
。如果没有正确声明floor()
和log2()
,编译器将从调用上下文中推断出原型并获取int log2(int)
和int floor(int)
,这与C语言中的实际定义不兼容。库。
使用适当的包含,log2(N)
在基数2中给出N
的对数。它的整数部分是2 <= {N
的幂,因此比位数少1在N
中。
但是请注意,此方法不适用于N
的负值,并且仅对0
起作用,因为NaN
到int
的转换为{{1 }},因此是一个二进制数字。