printf如何在此程序中将小数转换为二进制?

时间:2017-08-11 17:03:45

标签: c

我遇到过这个程序,将小数字转换成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);
    }
}

3 个答案:

答案 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起作用,因为NaNint的转换为{{1 }},因此是一个二进制数字。