java 位运算的理解
代码块
本文部分转载自http://www.cnblogs.com/song-wentao/的博文
package util;
public class bitOperation {
public static void main(String[] args) {
/**
* java 进制 理解
*/
int i = 235;
System.out.println("============");
System.out.println("十进制转二进制 " + Integer.toBinaryString(i));
System.out.println("十进制转八进制 " + Integer.toOctalString(i));
System.out.println("十进制转十六进制 " + Integer.toHexString(i));
System.out.println("============");
System.out.println("二进制转十进制 " + Integer.valueOf("11101011", 2));
System.out.println("八进制转十进制 " + Integer.valueOf("353", 8));
System.out.println("十六进制转十进制 " + Integer.valueOf("EB", 16));
System.out.println("十六进制转二进制 " + Integer.toBinaryString(Integer.valueOf("eb", 16)));
/**
* java 高位低位 理解
*/
int j = 0xeb ;
int low = j & 0xFF ; //11111111
int high = j >>> 8 ;
System.out.println("============" + Integer.toBinaryString(0xFF));
System.out.println("j : " + j );
System.out.println("j二进制 : " + Integer.toBinaryString(j) );
System.out.println("低位 low :" + low);
System.out.println("低位 low 二进制 :" + Integer.toBinaryString(low) );
System.out.println("高位 high :" + high);
System.out. println("高位 high二进制 :" + Integer.toBinaryString(high) );
/**
* java 位运算
*/
// 左移
System.out.println("============");
System.out.println(Integer.toBinaryString(5));
System.out.println("5<<2 :"+Integer.toBinaryString(5<<2));
System.out.println(Integer.valueOf(Integer.toBinaryString(5<<2),2));
//右移
System.out.println("20>>2 : "+Integer.toBinaryString(20>>2));
System.out.println(Integer.valueOf(Integer.toBinaryString(20>>2),2));
//无符号右移 在高位补0而不是按符号补
//负数规则: 正数取反+1 如 101 事实上是 00000000000000000000000000000101 取反 11111111111111111111111111111010 再+1
System.out.println("=============无符号右移");
System.out.println(Integer.toBinaryString(-5));
//00000000000000000000000000000101 =>
//00000000000000000000000000000001
System.out.println(Integer.toBinaryString(5>>>2)); // 5>>>2 = 5>>2
//11111111111111111111111111111011 =>
//11111111111111111111111111111110
System.out.println(Integer.toBinaryString(-5>>2));
//11111111111111111111111111111011 =>
//00111111111111111111111111111110
System.out.println(Integer.toBinaryString(1073741822));
System.out.println(Integer.valueOf("00111111111111111111111111111110", 2));
System.out.println(Integer.toBinaryString(-5>>>2));
//左移,正负数不影响
/* 因为左移是在后面补0
而右移是在最前面边补1或0
有无符号是取决于数的前面的第一位是0还是1
所以右移是会产生到底补1还是0的问题。
而左移始终是在右边补,不会产生符号问题。
所以没有必要无符号左移<<<。
无符号左移<<<和左移<<是一样的概念
*/
//位运算 与,或,非,异或
System.out.println(5 & 3);// 结果为1
System.out.println(5 | 3);// 结果为7
System.out.println(5 ^ 3);// 结果为6 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
System.out.println(~ 5);// 结果为-6
}
}