您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!
你看下这篇文章就清楚了
首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。
左移位:<<,有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用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型数据进行操作时要注意,例如有一下代码片段:非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!
温馨提示:内容为网友见解,仅供参考
JAVA 位运算 (byte) (a << 2); 是什么意思?
(2)>> : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移 (3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移 (4)移位操作的数据类型可以是byte, char,...
java中byte是什么意思
Java中的byte是一种基本数据类型,它占用1个字节,即8位,范围在-128到127之间。byte通常用于处理二进制数据或者字节流,比如文件读取、网络传输等。byte的小尺寸使得它在某些场景下使用更加高效,比如在嵌入式系统或者节约带宽传输的环境中。同时,byte还可以通过位运算进行位操作,或者用于存储补码表示二进...
java byte的作用?
java byte代表字节,作用范围如下:1.byte在java中是一种是数据类型,代表一个字节,一个字节包含8个位,所以,byte类型的取值范围为-128到127。2.在某些程序中(尤其是和硬件有关的程序)会将某些数据存储到字节类型的变量中,比如00110010,其中每个位都代表一个参数,然后以位运算的方式对参数进行取值...
JAVA位运算符
器内的二进制位。Java的设计初衷是嵌入电视机顶盒内,所以这种低级操作仍被保留了下来。但是,我们可能不会过多地使用到位运算符。 如果两个输入位都是 1,则按位“与”操作符(&)生成一个输出位 1;否则生成一个输出位0。如果两个输入位里只要有一个是1,则按位“或”操作符(|)生成一个输出位1;只有在两个...
java(byte)>>>时怎么运算的
(byte)0x72>>>2 = 28 (int)0xa2>>>2 =28 (错误)(byte)0x72 是十进制的114, 114转换成二进制是 1110010,1110010>>>2 (位移两位)是11100,而11100转换成十进制是:28 而(int)0xa2是十进制的162,162转换成二进制是 10100010, 10100010>>>2 是101000 ,实际的值是40,不是28....
java 怎么把一个字节 高低位互换啊?
位运算啊 byte b='0';int b1=b<<4&0xf0; \/\/左移4位和 11110000与运算 低位变高位 int b2=b>>>4&0x0f;\/\/右移4位和 00001111与运算 高位变低位 byte c=b1+b2; \/\/高位低位相加得到高地位互换。
java中的<<是什么意思?
位移动运算符:<<表示左移, 左移一位表示原来的值乘2.例如:3 <<2(3为int型)1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000...
两个byte按位异或后怎么储存在byte里
在Java中,我们使用字节(byte)类型来存储数据,字节的大小为8位。当我们说 "两个byte按位异或后怎么储存到byte里" 时,实际操作的是字节级别的位运算。假设我们有两个字节i和j,分别代表二进制数1和2,我们可以使用位异或(XOR)操作来处理它们。位异或操作遵循一个简单但重要的规则:两个相同比特位...
二进制与位运算实用操作汇总(基础篇)
shr操作(>>):右移,符号位决定填充0或1,相当于除以2的指定位数。原理篇进制转换:二进制与十六进制的转换基于位对齐,如每四个二进制位对应一个十六进制位。字节与二进制:byte作为内存最小单位,与二进制的关系影响了二进制与十六进制的实用性。二进制运算符范围与性质运算符的使用受限于参与变量...
java中位运算符,(byte) 0x80 的那个,为何答案是-32
byte 共有 8 位,表示范围是 -128 ~ 127,二进制即 10000000 ~ 01111111,第一位为符号位,1 表示负数,0 表示整数,11111111 即表示 -127,10000000 比较特殊,表示 -128。所以,0x80 本来是整数的 128,二进制 00000000000000000000000010000000 (Java 中整数4个字节32位)。(byte)0x80,将其转换...