首页 新闻 搜索 专区 学院

输出一个二进制的数,请各位帮忙解读一下

0
悬赏园豆:80 [待解决问题]
#include <iostream>
using namespace std;
void main()
{
int n;
cout << "input n:";
cin >> n;
for(int i=1; i<=32; i++)
{
cout << (n<0?1:0) << (i%8==0?"":"");//这句是什么意思?
n = n<<1;//这句呢?
}
cout << endl;
}
问题补充:

移位后怎么判断n是否大于0

n不是越来越来大吗

C++入门菜鸟的主页 C++入门菜鸟 | 初学一级 | 园豆:48
提问于:2011-10-31 13:10
< >
分享
所有回答(5)
0
cout << (n<0?1:0) << (i%8==0?"":"");//这句是什么意思?


这句的意思是  两次输出,第一次输出 

n<0?1:0,第二次输出 i%8==0?"":"" 。解析一下,输出时用三目运算符,表示n<0就输出1,否则输出0,后面的表示i除以8余数是0输出冒号前面的空字符,否则输出冒号后面的空字符,其实都是空字符(其实都是空字符,这里不需要分这两种情况)
n = n<<1;//这句呢?

这句话是移位操作,左移1位,你可以google一下就明白了。
希望可以帮到你。

LCM | 园豆:6876 (大侠五级) | 2011-10-31 13:37
0

这个是把输入的十进制转换成二进制输出。cout << (n<0?1:0) << (i%8==0?"":"");这句话的意思是如果n<0输出1,如果n>=0输出0,后面的(i%8==0?"":"")其实没什么用相当于""(可以用""带入试试结果),唯一的作用就是把二进制位0或者1连接起来,没有空格。n<<1就是n左移一位,相当于乘以2.

例子:

输入5(0000000000000101)

按上诉程序的步骤:

1.n=5,即n=0000000000000101>0,则输出0,左移1位

2.得到n=0000000000001010>0,则输出0,左移1位

3.得到n=0000000000010100>0,则输出0左移1位

.

.

.

29.得到n=0101000000000000>0,则输出0,(此时已经输出为0000000000000)左移1位

30.得到n=1010000000000000<0,则输出1,(此时已经输出为00000000000001)左移1位

31.得到n=0100000000000000>0,则输出0,(此时已经输出为000000000000010)左移1位

32.得到n=1000000000000000<0,则输出1,(此时已经输出为0000000000000101)左移1位

33.得到0000000000000000

循环结束

输出5的二进制表示0000000000000101

结束,LZ慢慢享用.

Kahuna | 园豆:191 (初学一级) | 2011-10-31 13:45

看了楼下的才发现数字位数打错了。应该是 0000 0000 0000 0000 0000 0000 0000 0101

我还是太粗心。

支持(0) 反对(0) Kahuna | 园豆:191 (初学一级) | 2011-10-31 14:28

您好 请最后怎么判断n>0或<0,每次移位都乘以2不是越来越大吗?

支持(0) 反对(0) C++入门菜鸟 | 园豆:48 (初学一级) | 2011-12-15 01:44
1

这个是移位法10进制转2进制的作法,这个方法有缺陷的,先说说你这个程序吧:

语法就不说了,主要是算法,拿楼上的数字来说吧,数字5在32位机器底层上最终存储形式为:

0000 0000 0000 0000 0000 0000 0000 0101

你可以看到,这个就是我们要输出的结果,但如何输出呢,我们可以利用符号位来实现。

左边第一位表示符号位(1表示负数字,0表示正数字),所以我们只需要把这个数字向左移位,判断数字的正负就可以了,这就是程序中

cout << (n<0?1:0) ;//判断n是否为负数
n = n<<1;//左移一位(也就是n乘以2)

这两行的意思,不知道你有没有弄明白。另外代码中 << (i%8==0?"":"") 这个是多余的,可以去掉。

刚才说这个程序有缺陷是因为这里默认机器是32位(i<=32)的,如果换个环境(16位)那么程序就会出错,所以最好不这样写。

artwl | 园豆:16536 (专家六级) | 2011-10-31 14:25

嗯,问题主要出在16系统的cpp不一样:On older, 16-bit operating systems, int was 16-bit and long was 32-bit.

支持(0) 反对(0) today4king | 园豆:3299 (老鸟四级) | 2012-03-16 14:26
0
cout << (n<0?1:0) << (i%8==0?"":"");//这句中cout是输出流,n<0?1:0是一个问号表达式,如果n小于0则输出1,否则输出0
//整数在内存中用32位补码表示,即如果n的最高位为1,则n为负数;如果n的最高位为0,则n为正数或0。
//于是,当最高位为1时,由于n为负数,即n小于0,所以n<0成立,输出1;
//当最高位为0时,由于n为0或正数,所以n<0不成立,输出0;
//(i%8==0?" ":"")首先,我觉得第一对双引号中间应该有一个空格,意思是每输出8位二进制数字之后输出一个空格隔开,方便阅读
//语法是,%为求余,如果i除以8余0则输出一个空格
n = n<<1;//这句的意思是每次输出一个二进制数后,把n左移一位,即把n的次高位移到最高位上,以此类推,这样当下次执行这个循环的时候,n的最高位就是原来的次高位,这样每次循环中,表达式n<0就可以依次检查n在内存中的从最高位到最低位,每个二进制位是0还是1,并输出相应的二进制数。由于VC平台32位机中int类型是32位的,所以循环32次结束。
不知道这样讲,是否清楚。。希望能帮到你
关于您的问题补充的回答:
(n<0?1:0)   n是否小于0是在问号表达式中进行判别的 即 : 
 表达式1?表达式2:表达式3
当表达式1为真,则执行表达式2,否则执行表达式3
cybersword | 园豆:205 (菜鸟二级) | 2011-10-31 23:28
0

楼上已经回答得很详细了 我觉得没有什么补充了

唯吴独尊 | 园豆:707 (小虾三级) | 2011-11-01 22:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册