java中的二进制int与byte互转以及&0xff的作用

原创 2016年08月31日 15:43:26

1.      按位与&  :两位全位1,结果才为1;

0&0=0;  0&1=0  ; 1&1=1

如:51 &5 =0011 0011 & 0000 0101=0000 0001 = 1

作用:清零、取一个数中指定位(即被与数0000)


2.      按位或| :只要有一个为1,结果就为1 ;

 

3.      异或^ :相同为0,不同为1 ;

0 ^ 0 =0 ; 0 ^1 = 1 ; 1 ^ 1=0;

作用:使特定位翻转(^ 1111 即翻转)

 

4.      取反运算 ~ :按位取反, 0变成1 ,1变成 0;

 

5.      <<左移运算 :将一个运算对象的各二进制位全部左移若干位(左边的丢弃,右边的补0)

 

6.      >>右移运算:将一个数各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

 

7.      >>>无符号右移:各个位向右移指定的位数,左边空出的位用0来填充,移出的右边位丢弃。

 

以下都是对负数而言,正数的原码、补码、反码都是其本身(原码)。

 

8.      原码:一个正数按照绝对值大小转换成的二进制数称为原码;

 

9.      反码:将二进制数按位取反。(符号位不取反)

 

10.   补码:反码+1;

 

11.   引入原码反码 和补码的目的就是为了解决减法问题,因为计算机CPU的运算器中只有加法器,要把减法转化成加法来计算。

   如“-16+11”的运算:

11110000     + -16的补码

00001011       11的补码

————

11111011       - 5的补码

有了以上知识,下面做int和byte的互相转换:

public static byte[] intToByte(int a){
		byte bt[]=new byte[4];
		bt[0]=(byte)((a>>0*8)&0xff);
		bt[1]=(byte)((a>>1*8)&0xff);
		bt[2]=(byte)((a>>2*8)&0xff);
		bt[3]=(byte)((a>>3*8)&0xff);
		return bt;
	}

	public static int byteToInt(byte[] a){
		System.out.println((int)a[0]);  //这里输出的是-49
		System.out.println((int)(a[0]&0xff));//这里输出是207
		int rs0=(int)((a[0]&0xff)<<0*8);
		int rs1=(int)((a[1]&0xff)<<1*8);
		int rs2=(int)((a[2]&0xff)<<2*8);
		int rs3=(int)((a[3]&0xff)<<3*8);
		int result=rs0+rs1+rs2+rs3;
		return result;
	}
发现一个奇怪的现象, 直接输出(int)a[0]结果是-49,而(int)(a[0]&0xff)理论上不变,但是输出的结果却是207;

原来,java的int是4个字节32位的,在控制台进行输出的时候,jvm把11001111之前进行了补全,补为11111111 11111111 11111111 11001111,显然这是-49的补码,输出结果是-49;而如果进行了a[0]&0xff ,补全后则变成00000000 00000000 00000000 11001111,此时结果变成了207,这时进行运算结果才是正确的。

java中,转换时int输出时 若byte符号位是0,如01001000,则进行int补0处理--》00000000 00000000 00000000 01001000;

                                          若byte符号位是1,如11001000,则进行补1处理-->1111111 11111111 11111111 11001000

Ps: &0xff的作用就是把其他位置0,这八位不变;

      一些实用的函数:Integer.toBinaryString(8100);可以输出二进制码;

         String s="abc";     byte[] bt = s.getBytes();可以得到字符串的二进制码// s.getByte("utf-8")参数也可以指定编码方式!

           for(byte b:bt){

         System.out.println(Integer.toBinaryString(b));//输出二进制码 

    如果通过字节序列变成string,可以通过String s=new String(bt,"asci"); 形式

   

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java中为何与0xff进行与运算

为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) {   String ret = ...
  • birdflyto206
  • birdflyto206
  • 2015年12月09日 12:41
  • 4835

三句话解释:java中,byte转为int为何要&0xff

第一,oxff默认为整形,二进制位最低8位是1111  1111,前面24位都是0; 第二,&运算: 如果2个bit都是1,则得1,否则得0; 第三,byte的8位和0xff进行&运算后,最低8位中,...
  • cherry609195946
  • cherry609195946
  • 2014年12月16日 11:19
  • 4299

Java中byte转换int时与0xff进行与运算的原因

java中byte转换int时为何与0xff进行与运算在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) {  String re...
  • sunyujia
  • sunyujia
  • 2008年05月04日 20:01
  • 8704

java中byte转换int时为何与0xff进行与运算

在剖析该问题前请看如下代码例一:/**          * 从byte数组开始位置取4位得到一个int         * @parama ba byte数组         * @return 返...
  • xiaojianpitt
  • xiaojianpitt
  • 2008年07月29日 10:02
  • 5284

java中byte(负值)作&运算时0xff的作用

1.问题由来 项目中遇到一个将byte字节流转换成有符号整数和无符号整数的,发现: byte aByte = ByteBuffer.get();----对应的二进制各位 如果byte为正数:...
  • u012582402
  • u012582402
  • 2016年06月29日 20:44
  • 3448

Java中的位操作: & 0xff

在Java语言中涉及到字节byte数组数据的一些操作时,经常看到 byte[i] & 0xff这样的操作,这里就记录总结一下这里包含的意义: 1、0xff是16进制(十进制是255),它默认为整形,...
  • wujian946110509
  • wujian946110509
  • 2017年02月03日 14:49
  • 706

&0xFF是怎么个意思

今天看了下同事从网上拷贝的base64加密的代码,看到了这样如下的代码 public static String encode(byte[] data) { StringBuild...
  • zhaowei5210
  • zhaowei5210
  • 2017年04月28日 19:05
  • 12273

浅谈 &0xFF操作

在java.io.FilterOutputStream.DataOutputStream:与机器无关地写入各种类型的数据以及String对象的二进制形式,从高位开始写。这样一来,任何机器上任何Data...
  • LVGAOYANH
  • LVGAOYANH
  • 2016年12月06日 16:59
  • 11064

toHexString(b[n] & 0XFF)为什么要和0XFF做与运算

在32位的电脑中数字都是以32格式存放的,如果是一个byte(8位)类型的数字,高24位里面都是随机数字,低8位 才是实际的数据。 java.lang.Integer.toHexString() ...
  • wangyang1354
  • wangyang1354
  • 2016年08月23日 14:24
  • 5502

&0xFF 的意义

今天看了下同事从网上拷贝的base64加密的代码,看到了这样如下的代码 public static String encode(byte[] data) { StringBuilder...
  • hya123456hya
  • hya123456hya
  • 2017年06月16日 15:14
  • 614
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中的二进制int与byte互转以及&0xff的作用
举报原因:
原因补充:

(最多只允许输入30个字)