十进制-二进制转换测试 v2

来源:互联网 发布:windos系统mac怎么 编辑:程序博客网 时间:2024/06/07 18:19

几个月前,在学习《程序设计基础》课程时,授课老师提到的一个思考题:猜数游戏。其关键模块是如何把十进制数转换成二进制数码。那时我还在用纯初等数学的算法来做这件事,所以能转换的最大值只能到 511 (2的9次方减1)。具体实现代码参见:《十进制-二进制转换测试》。

现在,《程序设计基础》学完已经有十几天了,再回过头来看那个问题,发现其实用位运算可以很方便地解决。实现代码如下:

#include <iostream>using namespace std;int main(){int DecimalToBinary_v2(int n);int n;cout << "输入一个十进制整数:";cin >> n;cout << "对应的二进制码为:" << endl; DecimalToBinary_v2(n);return 0;}int DecimalToBinary_v2(int n){int bit[32];for(int i = 0; i < 4 * 8; i++)bit[i] = (n >> i) & 1;for(int i = 31; i >= 0; i--){cout << bit[i];if(i % 4 == 0) cout << ' ';}cout << endl;}

测试结果:

1,正整型数的最大值为2147483647,输入控制台,显示数码为:


即使输入更大的值,这个结果也不会变:




2,负整型数的最大值为 -2147483648,显示二进制码为:


绝对值比它小的,可以发现是以“非原码”的形式存储的:



而绝对值比它大的,显示结果都同最大值一样:




======================================分割线======================================

至于基于这个算法的猜数游戏,就不必实现了。要想实现,肯定是可以实现的:bit[32] 数组中哪一位为1,对应的数就出现在哪一张卡片上。但是:一共将有31张卡片供玩家挑选!并且平均每张卡片上有 2147483648 ÷ 31 > 6千万个数!谁有耐心从6千万个数中一个个地看有没有“他/她心中所想的那个数”呢?!所以猜数游戏的上界太大,其实会导致这个游戏不可行。所以,之前那个七张卡片版本的猜数游戏已经很好啦!详见:《猜数游戏(from 1 to n)》