Java 左移运算<< 右移运算>> 以及独特的无符号右移运算(根据小题目来理解)

左移运算(<<)

按位左移运算符。左操作数按位左移右操作数指定的位数。

正数左移的运算:

位数向左移 移几位就去除几位 并在二进制的后面添加几位0
10 << 2

10的二进制数是

 00001010

向左移动两位 (向左移动的两位直接删掉) 低位补0 结果是40

00101000

公式 M << N M*2的N次方

在这里插入图片描述

负数左移的运算

-10 << 2

负数原码转化为补码:符号位不变,数值位按位取反,末尾加1。

负数补码转化为原码:符号位不变,数值位按位取反,末尾加1。

步骤:

-10的原码 :负数的原码就是符号位加上真值的绝对值,

10001010

原码进行反码: 除了符号位不变 各个位取反

11110101

补码:在反码的基础上 +1

11110110

左移后的补码:

11011000

负数补码转化为原码:符号位不变,数值位按位取反,末尾加1。

符号位不变,数值位取反

10100111

原码:+1

10101000        //-40

右移运算(>>)

按位右移运算符。左操作数按位右移右操作数指定的位数。

正数右移运算 :

位数向右移 移几位就去除几位 并在二进制的后面添加(如果为负数 最高位补1 , 如果为正数 最高位补0 )

10>>2

10 的原码

00001010

右移2位

00000010    //2

公式:M/2N

负数的右移运算

-10 >> 2

-10 的原码

10001010

反码:最高位1 不变 其他位取反

11110101

补码:+1 操作

11110110

右移补码:负数右移 高位加1

11111101

负数的补码转原码 :最高位1 不变 其他位取反操作

10000010

然后加1

10000011       //结果 -3

无符号右移(>>>)

按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。

正数无符号右移

10 >>> 2

10 的 二进制数:

00000000     00000000    00000000    00001010

右移

00000000     00000000    00000000    00000010

负数无符号右移(恐怖如斯)

只是对32位和64位的值有意义 ( 无论正负高位都是0 )

-10 >>> 2

-10 的 原码:

10000000   00000000   00000000   00001010

反码:

11111111     11111111    11111111   11110101

+1 得到 补码

11111111     11111111    11111111   11110110

右移 高位补0 在IDEA中运算高位的0是省略的

00111111     11111111    11111111   11111101          //1073741821

在这里插入图片描述

测试工具 位置之间不可以有空格 我是为了能让大家看清 ,还有这个在线进制转换工具真不错

猜你喜欢

转载自blog.csdn.net/agood_man/article/details/108536209