0%

位运算之左移右移

这是大一初学编程时的一道题,当时做了详细的推导,才慢慢搞懂位运算,再次回顾,发现有些知识点确实已经忘记,但再看完后总能叫快速的想起,还是需要温故知新呀!下面附上当时的代码及笔记,并顺带将位运算中的左移&右移运算符进行回顾

十进制数转二进制数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;

int main()
{
int n;
// char c = 'a';
// c = c << 1;
// cout << c <<"c"<<endl; 字符型不可以位运算
cout << "type in a decimal number n: ";
cin >> n;
cout << "Convert n to a binary number:" << endl;
for(int i=0; i<32; ++i)
{
cout << (n<0?1:0) << ((i+1)%8==0?" ":""); // 问号表达式需要加括号
n = n<<1; // 位运算符:左移
}
cout << endl;
system("pause");
return 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慢慢享用.

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次结束。

位运算——左移&右移

  1. 左移 <<
    • 定义:将数字按位进行左移
    • 用法:a = a<<n;
    • 效果:通常情况下,左移n位,则代表将原始数字a乘以\(2^n\)
    • 注意:
      • 一般int类型为32位,最高位代表符号,0为正,1为负
      • 左移时右侧补零
      • 当1移动到,或者移出最高位时,注意数字将变号,且不服从上述“效果”
  2. 右移 >>
    • 定义:将数字按位进行右移
    • 用法: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

欲戴皇冠,必承其重,加油!