java的移位操作详解,左移和右移
左移位:<<,有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充
右移位:>>,有符号的移位操作
右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。
例子:
public static void main(String[] args)
{
System.out.println(3<<2);//3左移2位
System.out.println(-3<<2);//-3左移2位
System.out.println(6>>2);//6右移2位
System.out.println(-6>>2);//-6右移2位
}
输出结果
12
-12
1
-2
下面解释一下:
00000000 00000000 00000000 00000011 +3在计算机中表示
00000000 00000000 00000000 0000001100 左移2位,补0,结果为12
----------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000011 +3在计算机中表示
11111111 11111111 11111111 11111100
11111111 11111111 11111111 11111101 -3在计算机中表示
11111111 11111111 11111111 1111110100 左移2位,补0,结果为负数,就是补码了,求原码
10000000 00000000 00000000 00001011
10000000 00000000 00000000 00001100 结果-12
----------------------------------------------------------------------------------------------
这也说明了一个问题:在计算机中,以1开头的就是补码的形式,是负数。
00000000 00000000 00000000 00000110 +6在计算机中表示方法
0000000000 00000000 00000000 00000110 右移两位,正数补0,结果为1
----------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000110 +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在计算机中的表示
1111111111 11111111 11111111 11111010 右移两位,结果为负数
1000000000 00000000 00000000 000001
1000000000 00000000 00000000 000010 结果为-2
这个地方很容易弄混,多想几次就会慢慢理解了。
上面解释了带符号的移位操作,下面解释一下不带符号的移位操作
无符号的移位只有右移,没有左移使用“>>>”进行移位,都补充0
例如:
public static void main(String[] args)
{
System.out.println(6>>>2);
System.out.println(-6>>>2);
}
结果:
1
1073741822
分析:
00000000 00000000 00000000 00000110 +6在计算机中表示方法
0000000000 00000000 00000000 00000110 右移两位,正数补0,结果为1
-----------------------------------------------------------------------------------------------------
00000000 00000000 00000000 00000110 +6在计算机中表示方法
11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010 -6在计算机中的表示
0011111111 11111111 11111111 11111010 右移两位,补充0,结果为1073741822
移位操作要注意的问题是高(低)位是补0还是补1和对char, byte, short型的操作:
(1)<< : (left-shift), 最低位补0
(2)>> : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移
(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移
(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。
(5)移位操作符可以和=合并起来,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示将a右移两位后的值重新赋给a。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意,例如有一下代码片段:
分享到:
相关推荐
其实主要就是左移右移之类的,看代码就好。突然觉得应该做一个嵌入式的归档。期末之后再说吧。在此提醒一下自己。 4. Message Digest, format to uint8 in MATLAB and save .mat file in Python3 获取信息摘要,转换...
方块的移动分为两种类型:一种是定时自由下落,另一种是响应用户的按键操作(左移、右移、下移或旋转)。通过中介—控制器(Controller)实现不同对象间的通信与数据传递。例如,当方块下移时,启动一个线程定期调用...
MD5的过程包括一系列的位操作,如异或、与、或、左移、右移等,以及特定的函数运算,确保即使是微小的输入变化也会导致显著不同的输出。 在Java中使用MD5: 在Java中,我们首先需要导入`java.security....
vs没报错leetcode报错Java - 数据结构和算法以及 ...运算符摘要, 二进制补码:二进制负数, 递归 递归:函数直接或间接调用自身 直接的 间接 - 来自另一个功能 - 不常见 基本情况:应该在某人处,函数应该停止调用
通过一系列的位操作(如异或、左移、右移)和求模运算,确保任何微小的消息变化都会导致最终摘要的显著变化。 2. **创建数据结构**:在Delphi中,首先需要定义用于存储中间计算结果的缓冲区和最终摘要的变量。这些...
这四轮处理通过一系列位运算(如异或、与、左移、右移等)和特定的MD5变换矩阵来完成。MD5将输入数据分为64个块进行处理,并对每个块应用这些操作,最终生成一个128位的摘要。 在C++中,OpenSSL提供了`EVP_...
2. **混合运算**:使用位运算(如异或、左移、右移)和加法来组合各个字段的哈希码,以获得更好的分布。 3. **扰动函数**:在计算过程中加入扰动因子,进一步打乱哈希码的分布,降低碰撞概率。 4. **避免零值**:...
在数字信号处理及通用处理器领域,Barrel Shifter(桶形移位器)是一种重要的数据处理组件,它能够高效地执行逻辑右移、算术右移、向右循环、逻辑左移、算术左移以及向左循环等操作。本文探讨了不同类型的Barrel ...
摘要: 近几年,随着 Android手机及其相关设备的迅速普及,针对Android平台游戏的开发需求日益增多。“2048游戏”是一款益智类游戏,老少皆宜。该文设计并实现了基于Android平台的2048游戏,最后在手机上测试运行,...