这是大一初学编程时的一道题,当时做了详细的推导,才慢慢搞懂位运算,再次回顾,发现有些知识点确实已经忘记,但再看完后总能叫快速的想起,还是需要温故知新呀!下面附上当时的代码及笔记,并顺带将位运算中的左移&右移运算符进行回顾
十进制数转二进制数
1 |
|
附上当时的解析:
这个是把输入的十进制转换成二进制输出。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慢慢享用.
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次结束。
位运算——左移&右移
- 左移 <<
- 定义:将数字按位进行左移
- 用法:
a = a<<n;
- 效果:通常情况下,左移n位,则代表将原始数字a乘以\(2^n\)
- 注意:
- 一般int类型为32位,最高位代表符号,0为正,1为负
- 左移时右侧补零
- 当1移动到,或者移出最高位时,注意数字将变号,且不服从上述“效果”
- 右移 >>
- 定义:将数字按位进行右移
- 用法:
a = a>>n;
- 效果:通常情况下,右移n位,则代表将原始数字a除以\(2^n\)
- 注意:
- 一般int类型为32位,最高位代表符号,0为正,1为负
- 右移时,如果最高位为1,则从左侧补1,将不服从上述“效果”;如果为0,则补0,服从上述“效果”
- 当a为奇数时,上述“效果”也不成立。你如7<<2=3
参考:https://blog.csdn.net/qq_15037231/article/details/76999926