一、带符号按位左移 << 带符号右移>> 不带符号右移 >>>
-------------------------------------------------------------------------------------------------------------------
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();
}