java 位运算>><< >>> & | ~ ^ 代码详解
相关理伦文档这里不说了,也是网上看的,复制没意思!代码+算法请看下面代码
package org.rui.utf;
public class BinAlgorithm {
/**
* @param args
*/
public static void main(String[] args) {
int i=2;//2=10
int j=3;//3=11
/**
* 2乘2的3次方
* 2*2*2*2=16
*
* 转为二进制计算
* (2/2=1 余数0 前面补0共32位)
* 2=0000 0000 0000 0000 0000 0000 0000 0010
* 二进制移右3位 =0000 0000 0000 0000 0000 0000 0001 0000
* 10000转十进制(1乘2的4次方)=16 *
*/
System.out.println(i<<j);
i<<=j;//效果一样,就是算完再赋值给i
System.out.println(i);
/**
* 相反 除于2的3次方
* 2/2/2/2=0
*二进制2=0000 0000 0000 0000 0000 0000 0000 0010
*左移3位 =32个全是0
*/
System.out.println(i>>j);
int bt=-20;
//bt>>2= 1000 0000 0000 0000 0000 0000 0000 0101
System.out.println(">>:"+(bt>>2));
/**
* 无符号右移
* 它使用了“零扩展”:无论正负,都在高位插入0
* 20=10100
* 用补码表示,1000 0000 0000 0000 0000 0000 0001 0100
* >>>2= 0010 0000 0000 0000 0000 0000 0000 0101
*
* 1*2的30次方=1073741824 +-5
* =1073741819
* 为什么会这样算,这个问题也还在研究中,
*/
//bt>>>2= 0010 0000 0000 0000 0000 0000 0000 0101
System.out.println(">>>:"+(bt>>>2));
/**
位运算符包括: 与(&)、非(~)、或(|)、异或(^)
&:当两边操作数的位同时为1时,结果为1,否则为0。如1100&1010=1000
| :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110
~:0变1,1变0 ~ 是 一 元 运 算 法 ,对 数 据 的 每 个 二 进 制 位 取 反
^:两边的位不同时,结果为1,否则为0.如1100^1010=0110
*/
//10&11=10 转十进制=2
System.out.println(2&3);
//10|11=11 转十进制=3
System.out.println("2|3="+(2|3));
/**
* 2= 原码0000 0010
求补0000 0010
~2
取反1111 1101(所得为补码形式) 求补=取反+1
而~2 的原码形式
补码的补码 10000 0010+1=10000 0011 即-3
*/
System.out.println(~2);
//10^11=01 转十进制=1
System.out.println(2^3);
}
}
----------------------
package org.rui.test;
public class BitTest {
/**
* 关于>>取代除 <<取代乘 注意只能取代整数运算,被除和乘的数要是2的次方和
* @param args
*/
public static void main(String[] args) {
System.out.println((double)(1000>>6));
System.out.println(1000D/64D);
System.out.println(Integer.toBinaryString(1000));
/**
* 1111101000>>6=1111=15
*
*/
System.out.println((double)(1000<<6));
System.out.println(1000D*64D);
/**
* 1111101000<<6=1111101000 000000=
* 1*2的9次方+ 512
* 1*2的11次方+ 2048
* 1*2的12次方+ 4096
* 1*2的13次方+ 8192
* 1*2的14次方+ 16384
* 1*2的15次方+ 32768
* =64000
*
*/
}
}