java中byte的问题

Python019

java中byte的问题,第1张

0xFF == 二进制的:1111 1111

&是按位与运算,任何一个byte &0xFF都得原有的数,它主要应用于int等,可以参照这个:http://zhidao.baidu.com/question/2055765535243071187

所以你上面的例子中的两个&0xFF是废代码

第一个函数原本的意思应该为了截取最后一个字节。但是因为传递的不是int而是byte导致变得是byte强制类型转换为int,是个失败的设计,因为只要强制转换为byte就能达到相同效果了。多此一举

第二个函数是为了取得一个数对应的十六进制字符串,不过也跟上面的一样,因为传递的是byte,导致整个设计也是失败的。

您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!展开全部

你看下这篇文章就清楚了

首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。

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

左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用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中,设计int和比int位数来的小的类型,如byte,char等,都是先把小类型扩展成int再来运算,

byte b=-64

-64 的原码 11000000

反码 10111111

补码 11000000

b的整型值在扩展时最左边一位是符号位1,扩展后就是11111111 11000000

而b&255,这里255是整型,其值是00000000 11111111,与操作的结果是00000000 11000000