java中位移操作及按位与&
10行代码理解java中位移操作
之前对于位移操作只是看,不是很理解,今天简单练习了下,收获颇多。
public static void positionTest(){
/**
* 左移 高位(左侧)溢出抛弃,低位(右侧)补0
* 右移 正数高位补0 负数补1
* 无符号右移 高位补0(左侧补0)
*/
int i = 2;
System.out.println(Integer.toBinaryString(i) + "---原始二进制");
System.out.println(Integer.toBinaryString(i << 6));
System.out.println(Integer.toBinaryString(i >> 6));
System.out.println(Integer.toBinaryString(i >>> 6));
System.out.println("下边是负数位移:");
i = -2;
System.out.println(Integer.toBinaryString(i) + "---原始二进制");
System.out.println(Integer.toBinaryString(i << 6)+ "---负数显示的是补码:");
System.out.println(Integer.toBinaryString(i >> 6));
System.out.println(Integer.toBinaryString(i >>> 6));
}
控制台输出:
10---原始二进制
10000000
0
0
下边是负数位移:
11111111111111111111111111111110---原始二进制
11111111111111111111111110000000---负数显示的是补码:
11111111111111111111111111111111
11111111111111111111111111
按位与&
由于项目中要生成一个十六进制的序列,发现用到了按位与&操作。
public static void testMd5(){
Random random = new Random();
String s = String.valueOf(random.nextInt());
char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
try {
//java自带的生产散列算法工具类
MessageDigest digester = MessageDigest.getInstance("MD5");
try {
byte[] bytes = s.getBytes("UTF-8");
System.out.println("字节数组bytes:" + new String(bytes));
digester.update(bytes);
//得到一个长度为16的字节数组
byte[] digestBytes = digester.digest();
int j = digestBytes.length;
System.out.println("新字节数组长度:" + j);
char[] charArray = new char[j*2];
int k =0;
for (int i = 0; i <j; i++) {
byte thisByte = digestBytes[i];
System.out.println(thisByte);
charArray[k++] = hexDigits[thisByte >>>4 & 0xf];
charArray[k++] = hexDigits[thisByte & 0xf];
}
String resultStr = new String(charArray).toUpperCase();
System.out.println(resultStr);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
控制台输出:
字节数组bytes:-1691462660
新字节数组长度:16
-54
103
-55
21
-125
-122
-23
-60
64
-57
-2
72
-37
92
-11
-104
CA67C9158386E9C440C7FE48DB5CF598
其中:
& 0xf,由于0xf转换成二进制是:1111,所以进行按位与&操作之后,得到的是低4位的值,而不管高位的值及符号位。同理,如果& 0xff 11111111,那就是取低8位的值了。