左移运算(<<)
按位左移运算符。左操作数按位左移右操作数指定的位数。
正数左移的运算:
位数向左移 移几位就去除几位 并在二进制的后面添加几位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
测试工具 位置之间不可以有空格 我是为了能让大家看清 ,还有这个在线进制转换工具真不错