Java复习之知识点整理(十)---- 字节位运算:与、或、异或、带符号左右移,不带符号右移

一、带符号按位左移 << 带符号右移>> 不带符号右移 >>>
-------------------------------------------------------------------------------------------------------------------
1.内存中的位运算,都会先转换成int,4个字节进行运算,左侧不足用符号位补齐
2.<< n : 整体向左移动 n 位,左侧用符号位补齐,右侧用0补齐
3.>> n : 整体向右移动 n 位,左侧用符号位补齐
4.>>>n : 整体向右移动 n 位,左侧用0补齐


二、位 & | ^
-------------------------------------------------------------------------------------------------------------------
1.位& : 按位相乘,有0就为0
2.位| : 按位相加,有1就是1
3.位^ : 相同为0,不同位1
4.&运算小技巧: 一个int类型的数值 i, 与 0x000000ff(0xff),进行&预算,可以
保留最后一位字节上的数值,而将前面的数值全部变为0.然后再进行移位运算,
就可以很顺利的消除首尾的符号位的影响了。
5.|运算小技巧: 可以快速的对字节进行拼接,有1就为1,但是注意不进位奥,仅仅是当
前位,有1就为1.

三、十六进制的表现形式 0x...,与内存中的存储形式无关(内存中是以二进制存储的)
------------------------------------------------------------------------------------------------------------------
1. +6: 0x6
2. 255: 0xff
3. -6: -0x6
4. -255: -0xff
5. +15: 0xf
6. -15: -0xf


四、使用字节的位运算(左移右移,与或运算)完成:int类型和字节数组的相互转换
------------------------------------------------------------------------------------------------------------------
@Test  
	//测试int <--> byte[]
	public void ts()
	{
		int i = -255;
		byte [] bs = castIntToBytes(i);
		int j = castBytesToInt(bs);
		System.out.println(j);
	}
	
	//将int转换成字节数组
	public byte[] castIntToBytes(int i)
	{	
		byte b0 = (byte)(i >> 24);
		byte b1 = (byte)(i >> 16);
		byte b2 = (byte)(i >> 8);
		byte b3 = (byte)i;	
		return new byte [] {b0,b1,b2,b3};
	}
	
	//将字节数组转化成int
	public int castBytesToInt(byte [] bs)
	{
		int i0 = (int)(bs[0] << 24 );
		int i1 = (int)(bs[1] << 16 & 0x00ff0000);
		int i2 = (int)(bs[2] << 8 & 0x0000ff00);
		int i3 = (int)(bs[3] & 0x000000ff);		
		return (i0 | i1 | i2 | i3);
	}




五、使用字节的位运算(左移右移,与或运算)完成:int类型的二进制和16进制表示
------------------------------------------------------------------------------------------------------------------
@Test
	public void ts02()
	{
		System.out.println(intTo16(-255));
	}
	
	//int 转换成2进制
	public void intTo2(int j)
	{
		for(int i = 0; i <= 31 ; i ++)
		{
			int b1 = j << i >>> 31;			
			System.out.print(b1);
		}		
	}
	
	//int 转换成16进制表现形式
	public String intTo16(int x)
	{
		int y = x;
		
		//反复的操作字符串,首选StringBuilder,如果是线程中,要保证线程安全,首选StringBuffer
		StringBuilder s = new StringBuilder();
		
		if(x < 0)
		{
			y = -x;	
			s.append("-0x");
		}
		else 
		{			
			s.append("0x");
		}
		
		char [] arr = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
		
		for(int i = 0 ; i < 8 ; i++)
		{
			int t0 = ((y >>> (32 - 4 * (i + 1))) & 0xf);
			s.append(arr[t0]);			
		}
				
		return s.toString();	
	}




猜你喜欢

转载自blog.csdn.net/xcvbxv01/article/details/80874673
今日推荐