package testJava.bit;
public class 位运算符操作 {
/**
* gefei add 2014-3-19 19:15:52
* 鸣谢: 李东亮
* 参考: http://blog.csdn.net/lidongliang00001/article/details/21447495#comments
*
*/
public static void main(String[] args) {
int i = 2;// int有4个byte,1个byte有8个bit,所以int有32个bit
// i换成32位2进制数,整体向左移2位(2位最低位补0,2位最高位直接被屏蔽【最高位=1是负数,=0是正数】),然后把最终的值赋给i
System.out.println(i<<=2);
// i换成32位2进制数,整体向左移8位(8位最低位补0,8位最高位直接被屏蔽【最高位=1是负数,=0是正数】),然后把最终的值赋给i
System.out.println(i<<=8);
byte j = 8;
// j换成8位2进制数,整体向右移2位(2位最低位直接被屏蔽,2位最高位直接补0【最高位=1是负数,=0是正数】),然后把最终的值赋给j
System.out.println(j>>=2);
// j换成8位2进制数,整体向右移8位(8位最低位直接被屏蔽,8位最高位直接补0【最高位=1是负数,=0是正数】),然后把最终的值赋给j
System.out.println(j>>=8);
// & 【与】位运算符
// 从低位开始比较,只有两边都是1时,结果为1,否则为0。
System.out.println(19 & 25);// *010011 & *011001 = *010001 【19 & 25 = 17】
// 该运算符的常见应用场景是从一串bit中【&抽取】一部分,例如想抽取1101101的低四位,用1101101&0001111就可以得到低四位1101了。
// | 【或】位运算符
// 从低位开始比较,两边有一位是1或都是1时,结果为1,否则为0。
System.out.println(19 | 25);// *010011 & *011001 = *011011 【19 & 25 = 27】
// 该运算符的常见应用场景是【|拼接】两串bit,例如想把1010接在1101101的后四位,用11011010000|00000001011就可以得到11011011011了。
// ^ 【异或】位运算符
// 从低位开始比较,两边位不同时,结果为1,否则为0。
System.out.println(19 ^ 25);// *010011 & *011001 = *001010 【19 & 25 = 10】
// ~ 【非】位运算符
// 从低位开始比较,1变0,0变1。
System.out.println(~25);// *011001 = *100110 【~25 = -26】
// 李东亮的小例子
byte[] b=new byte[]{0x09,0x12};//0x09=00001001,0x12=00010010,一个字节为8为,为了方便理解,所以在前面补0,无其他意义。
// short 等于 2个byte 也就是16个bit
short s0 = (short) (b[1] & 0xff);// b[1]放在最低位 0000000000010010
short s1 = (short) (b[0] & 0xff);// b[0]放在最高位 0000000000001001
s1 <<= 8;// 左移8位 0000100100000000
System.out.println((short) (s0 | s1));//s= 0000100100010010
}
}