左移与右移

Posted yaggy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左移与右移相关的知识,希望对你有一定的参考价值。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 typedef unsigned char byte;
 6 int main() 
 7     int x =0x800000002;//-2的原码
 8     cout << x << endl;//输出 -2147483646
 9 
10     x = 0xFFFFFFFE;//-2,说明数值是以补码的形式存储的
11     cout <<x << endl;//输出-2
12 
13     byte x3 = -2;//0xFE
14     cout <<(int)x3 << endl;//输出254
15 
16     byte x4 = 0xFE;
17     cout <<(int)x4 << endl;//输出254
18 
19     int x5 = -2;
20     x5 =x5>> 2;
21     cout << x5<< endl;//输出-1
22 
23     int x6 = 8;
24     x6 =x6>> 2;
25     cout << x6<< endl;/输出2
26 
27     int x9 = -8;
28     x9 =x9<<3;
29     cout <<x9 << endl;//输出-64
30     
31     cout << sizeof(short) << endl;//2    
32     short x10 = 8;    
33     x10 <<=32;    
34     cout<<x10<<endl;    //输出8   
35     short x11 = 0xFFFE;     
36     cout<<x11<<endl;//-2      
37     x11 >>=2;     
38     cout<<x11<<endl;//输出-1
39 
40     int x12 = -1;
41     x12 = x12 << 1;
42     cout << x12 << endl;
43     system("pause");
44     return 0;
45 

 以上的实验说明计算机中负数是以补码的形式存在的。而且无论是负数还是整数左移就相当于乘以2,右移就相当于除以2。左移时,在后面填上0,右移时在前面补上符号位。这是算术移动。

逻辑移动就是不管往哪边移动,都补0。

 

然而我这里出现的问题是:

为什么我在vs上面进行负数移动时不会报错,在leetcode上进行移动时就会报错?

执行出错信息: Line 15: Char 27: runtime error: left shift of negative value -1 (solution.cpp)
最后执行的输入: [2,2,3,2]
 
int result = 0x00000000;
        for (int i = 31; i >= 0; i--)
            result =result<<1;
            result += bit[i] % 3;
       
这是leetcode代码。
 
 
 

以上是关于左移与右移的主要内容,如果未能解决你的问题,请参考以下文章

C语言位运算符:与或异或取反左移与右移详细介绍

单片机点阵怎么实现左移右移,谢谢

左移右移小结(转)

Java负整数的左移右移无符号右移

位运算符——左移右移

jQuery实现左移右移