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

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

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

#include 
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,输入控制台,显示数码为:

十进制-二进制转换测试 v2_第1张图片

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

十进制-二进制转换测试 v2_第2张图片

十进制-二进制转换测试 v2_第3张图片


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

十进制-二进制转换测试 v2_第4张图片

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

十进制-二进制转换测试 v2_第5张图片

十进制-二进制转换测试 v2_第6张图片

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

十进制-二进制转换测试 v2_第7张图片

十进制-二进制转换测试 v2_第8张图片


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

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

你可能感兴趣的:(C/C++,MOOC清华程设基础)