java中关于十进制数左移,右移,无符号右移问题解决

此文皆为本人观点,有不足的地方望指出!

由于在计算机中负数以补码存在,故开始时,我们的先把负数的原码变补码在开始操作。


左移位:<<,有符号的移位操作

左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充


右移位:>>,有符号的移位操作

右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。


无符号右移(注意:并没有无符号左移):>>> 无符号右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用全都用0 填充。

无符号右移不管正负号,移完后全都补0,这时候在把移完后的2进制转换为10进制,即为结果,这个数很大啊!


正数左移或者右移后的2进制转换为10进制即为结果。

负数左移或者右移时先取反(符号位不变)加1后,再左移或者右移,在取反(符号位不变)加1变成补码后,再转化为10进制。

补码 = 反码 + 1;


总结:除了1,-1右移2位(以移2位为例)结果为:0,-1外,他的左移结果为相反数!(4与-4)

即:正整数与负整数左移结果为相反数,正整数与负整数右移结果也为相反数,且正整数左移,右移后结果为正数,负整数移动后结果为负数(yw他们并不改变符号位!)

无符号右移的结果和正整数右移结果一样(以上皆是在移动位数相同情况下成立),且由于无符号右移不在乎符号之分,所以不管是正数或者负数,他们右移后的结果都为正数

如12>>2 = 3, -12>>2 = -3;12>>>2=3;


现在举例说明:

12<<2 = 48(12左移2位结果为48)   00000000 00000000 00000000 0000 1100 为12的二进制,现在把12左移2位变为:00000000 00000000 00000000 0011 0000

在转化为十进制为:48


12>>2 = 3   00000000 00000000 00000000 0000 1100 为12的二进制,现在把12右移2位变为: 00000000 00000000 00000000 0000 0011在把其转化为十进制为:3


-12 >>2 = - 3  由上知负数左移或者右移时先取反加1,即:10000000 00000000 00000000 0000 1100 为12的原码,取反为:11111111 11111111 11111111  1111 0011,在加1为:11111111 11111111 11111111  1111 0100,在把-12左移2位为:11111111 11111111 11111111  1111 1101,在取反加1为:100000000 00000000 00000000 0000 0011转换为十进制为:-3


12>>>2 = 3   12的无符号右移与12的右移结果一样为:3


-12>>>2 = 1073741821     由上知负数左移或者右移时先取反加1,即:10000000 00000000 00000000 0000 1100 为-12的原码,取反(符号位不变)为:11111111 11111111 11111111  1111 0011,在加1为:11111111 11111111 11111111  1111 0100,在把-12右移2位为:00111111 11111111 11111111  1111 1101,在把他转化为十进制为:1073741821 


由于在计算机中负数以补码存在,故开始时,我们的先把负数的原码变补码在开始操作。
C语言的位运算符包括左移运算符(<<)、右移运算符(>>)、按位与运算符(&)、按位或运算符(|)和按位异或运算符(^)。其左移运算符和右移运算符可以用来对一个进行位移操作。无符号左移右移是指将一个无符号的二进制表示向左或向右移动指定的位,移动后的空位用0填充。下面是一个无符号左移的例子: 引用:例子二:无符号左移 #include <stdio.h> int main(){ unsigned int a = 0x80000001; int i=0; for(;i<64;i++){ printf("left %d:%08x,%u\n",i,a<<i,a<<i); } } 在这个例子,我们定义了一个无符号整型变量a,并将其初始化为0x80000001。然后我们使用for循环对a进行了64次左移操作,每次左移的位从0到63。在每次左移后,我们使用printf函输出了左移的位左移后的结果以及结果的十进制表示。可以看到,每次左移后,a的值都会乘以2的移动位次方。 无符号右移是指将一个无符号的二进制表示向右移动指定的位,移动后的空位用0填充。下面是一个无符号右移的例子: 引用:例子四:无符号右移 #include <stdio.h> int main(){ unsigned int a = 0x10000001; int i=0; for(;i<64;i++){ printf("left %d:%08x,%u\n",i,a>>i,a>>i); } } 在这个例子,我们定义了一个无符号整型变量a,并将其初始化为0x10000001。然后我们使用for循环对a进行了64次右移操作,每次右移的位从0到63。在每次右移后,我们使用printf函输出了右移的位右移后的结果以及结果的十进制表示。可以看到,每次右移后,a的值都会除以2的移动位次方。 需要注意的是,对于有符号左移右移,如果移动后的空位用符号位填充,那么就会出现符号位溢出的问题。例如,如果将一个有符号整型变量i的值左移3位,那么移动后的空位将用符号位填充。如果i的值为8,那么左移3位后,i的值将变为64,而不是24。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值