我是靠谱客的博主 安静火龙果,最近开发中收集的这篇文章主要介绍左移与右移,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 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代码。
 
 
 

转载于:https://www.cnblogs.com/yaggy/p/11326515.html

最后

以上就是安静火龙果为你收集整理的左移与右移的全部内容,希望文章能够帮你解决左移与右移所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部