操作符:关于左移<< 右移>>的理解

首先我们要知道,整数在内存中的存放的是补码
注:三码的第一位都为符号位,符号位第一位为0,表示存放的是正整数,符号位为1,表示存放的是负数
若存放的是正整数 那么原码 反码 补码是相同的   例如存放的整数是3    3转化为二进制是0011
三码都为32位,空位补0     所以 正整数3的三码均为
0000 0000 0000 0000 0000 0000 0000 0011
若整数为-3 那么三码的值如下(符号位变为1)
原码 
1000 0000 0000 0000 0000 0000 0000 0011
反码就是在原码的基础上对补码取反
反码 
0111 1111 1111 1111 1111 1111 1111 1100
补码
补码就是在反码的基础上加一
0111 1111 1111 1111 1111 1111 1111 1101
那么 左移操作符,就是将整数3的补码 整体向左移动一位(位数可变)
int a = 3;
int b = a << 1;左移操作符(<<)右边必须为正整数,正整数为几,就向左位移几位
左移规则(高位遗弃,低位补0)
左移补码变化如下
0000 0000 0000 0000 0000 0000 0000 0011  原补码
0000 0000 0000 0000 0000 0000 0000 0110  左移之后补码
左移补码转换进制为6   所以3左移一位的结果为6
当变量a变为-3时  我们要对-3的补码进行逆运算
-3的原码
1000 0000 0000 0000 0000 0000 0000 0011
反码
0111 1111 1111 1111 1111 1111 1111 1100
补码
0111 1111 1111 1111 1111 1111 1111 1101
左移一位补码变化为
1111 1111 1111 1111 1111 1111 1111 1010
位移之后我们将补码逆运算为原码
反码(取反时符号位不变)
1111 1111 1111 1111 1111 1111 1111 1001
原码
1000 0000 0000 0000 0000 0000 0000 0110
转换进制为-6  所以3左移一位为-6
由此可见 左移一位等同于将变量×2

右移有两种情况
1   算数移位:右边丢弃   左边补原始符号位
2   逻辑移位:右边丢弃   左边补0
注:在大多数编译器中都应用的算数位移。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值