#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不是越来越来大吗
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一下就明白了。
希望可以帮到你。
这个是把输入的十进制转换成二进制输出。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慢慢享用.
看了楼下的才发现数字位数打错了。应该是 0000 0000 0000 0000 0000 0000 0000 0101
我还是太粗心。
您好 请最后怎么判断n>0或<0,每次移位都乘以2不是越来越大吗?
这个是移位法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位)那么程序就会出错,所以最好不这样写。
嗯,问题主要出在16系统的cpp不一样:On older, 16-bit operating systems, int was 16-bit and long was 32-bit.
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
楼上已经回答得很详细了 我觉得没有什么补充了