十进制转换二进制 非递归实现

缺乏、安全感 2022-04-10 10:57 272阅读 0赞

做了个十进制转换成二进制的题,就是容易忽略一些细节。
我写的十进制转换二进制函数代码是这样的

  1. int fan(int n)
  2. {
  3. int i=0,a[100];
  4. while(n)
  5. {
  6. a[i]=n%2;
  7. i++;
  8. n/=2;
  9. }
  10. while(i--)
  11. printf("%d",a[i]);
  12. }

但是我看了大神的代码之后,就有点不懂了。

  1. int fan1(int n)
  2. {
  3. int i=0,a[100];
  4. while(n)
  5. {
  6. a[i]=n&1;
  7. i++;
  8. n/=2;
  9. }
  10. while(i--)
  11. printf("%d",a[i]);
  12. }

我当时不懂为什么n&1可以替换n%2。之后上网查了查。
首先,a&b表示,a和b在计算机中存储的对应二进制码按位取与;
例如:
a的二进制码为:0111,b的二进制码为:0011时:
0111
& 0011
= 0011
对应十进制形式为:7&3=3;
同理:因为1的对应存储的二进制码除了最低位,其他位都是0,所以,n&1要么为1(n为奇数时,n的最低位为1),要么为0(n为偶数时,n的最低位为0)。
综上可得:n&1等效于 n%2==1 。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int fan(int n)
  4. {
  5. int i=0,a[100];
  6. while(n)
  7. {
  8. a[i]=n%2;
  9. i++;
  10. n/=2;
  11. }
  12. while(i--)
  13. printf("%d",a[i]);
  14. }
  15. int fan1(int n)
  16. {
  17. int i=0,a[100];
  18. while(n)
  19. {
  20. a[i]=n&1;
  21. i++;
  22. n/=2;
  23. }
  24. while(i--)
  25. printf("%d",a[i]);
  26. }
  27. int main()
  28. {
  29. int n;
  30. scanf("%d",&n);
  31. fan(n);
  32. printf("\n");
  33. fan1(n);
  34. system ("pause");
  35. return 0;
  36. }

发表评论

表情:
评论列表 (有 0 条评论,272人围观)

还没有评论,来说两句吧...

相关阅读