没有 for、while 或 if 循环的十进制到二进制

Posted

技术标签:

【中文标题】没有 for、while 或 if 循环的十进制到二进制【英文标题】:Decimal to binary without for, while, or if loops 【发布时间】:2021-02-09 07:03:55 【问题描述】:

如何编写一个程序来读取整数并显示二进制数而不使用循环,只使用二进制运算符? (仅限基本功能)

 #include<stdio.h>     
 #include<stdint.h>     
 #include<math.h>        
 int main()       
 uint8_t a;      
 scanf("%hhd", &a);   
 //i have read the integer, but I don't know how to go on  
 return 0;      
       

【问题讨论】:

***.com/questions/111928/… 输出 MSB:putchar('0' + !!(a &amp; 0x80)) 这能回答你的问题吗? Is there a printf converter to print in binary format? 顺便说一下,“%hhd”的格式很糟糕。 C 可能将其理解为%hd,即short int,但您的变量是uint8_t。写入堆栈的值将是short int,可能是 16 位。您可能希望将简单的unsigned int%u 一起使用。如果您想继续使用uint8_t,您可以参考另一个问题***.com/questions/23748257/… @Robert:%hhd 有什么问题?当然,最好使用%hhu,因为变量是uint8_t(无符号类型),但C11 §7.21.6.2 The fscanf function 指定hh 修饰符(之前的C99 也是如此)。我想你可以主张使用&lt;inttypes.h&gt;SCNu8 作为格式:"%" SCNu8 【参考方案1】:

不使用循环显示二进制数,仅使用二元运算符:

#include<stdio.h>     
#include<stdint.h>     
#include<math.h>        
int main()       

  int a;      
  scanf("%u", &a);

  printf("Number: 0x%X\n", a);
  
  printf("%d", ((a & 0x80) >> 7));
  printf("%d", ((a & 0x40) >> 6));
  printf("%d", ((a & 0x20) >> 5));
  printf("%d", ((a & 0x10) >> 4));
  printf("%d", ((a & 0x08) >> 3));
  printf("%d", ((a & 0x04) >> 2));
  printf("%d", ((a & 0x02) >> 1));
  printf("%d", ((a & 0x01) >> 0));

  printf("\n");
  
  return 0;      
      

注意,由于输入是整数,我添加了printf

131
Number: 0x83
10000011

当然,使用循环会更容易:

int main()       

  int     a;
  uint8_t Mask;
  uint8_t Shift;
  scanf("%u", &a);

  printf("Number: %X\n", a);

  Mask  = 0x80;
  Shift = 7;
  
  while (Mask > 0)
  
    printf("%d", ((a & Mask) >> Shift));
    Mask = Mask >> 1;
    Shift--;
  

  printf("\n");
  
  return 0;      
      

【讨论】:

以上是关于没有 for、while 或 if 循环的十进制到二进制的主要内容,如果未能解决你的问题,请参考以下文章

4 常见循环if,while,for

while循环的条件?

Python基础语法—— 条件语句(if)+循环语句(for+while)

自动化快速上手--Python--if--while--for循环--每天半小时--超详解篇

在C中的while循环或for循环之后没有代码执行[重复]

小白的Python之路 day1 表达式if ... else ,while循环,for循环