Java位运算符,
Java位运算符,
1、正负数二进制表示形式即关系
在了解位移之前,先了解下正数和负数的二进制表示形式和关系:
举例 15和-15 :
15 的原码 : 00000000 00000000 00000000 00001111
补码:11111111 11111111 11111111 11110000
+1 =
-15的原码:11111111 11111111 11111111 11110001
负数的原码即为正数的原码取反之后再加1;
2、位移操作
位移操作只针对int类型的数据有效,java中一个int的长度是32位,即4字节。除了int型以外,还可以表示byte、short、char、long。当为这四种类型的时候,JVM会先把他们转换为int型在进行操作。
<< 左移,
>>右移,
>>>无符号右移
2.1 m<<n的含义
把m表示的二进制数左移n位,高位移出n位都舍弃,地位补0(此时将会出现正数变负数的情况)。 实例:3<<23的二进制形式:00000000 00000000 00000000 00000011 左移2位得到: 00000000 00000000 00000000 00001100 = 2*2*2+2*2= 12; 左移一位元数据变为以前的2倍
左移使整数变为负数:
10737418<<8
10737418二进制表示形式:00000000 10100011 11010111 00001010,按照$1的原理,得到10100011 11010111 00001010 00000000,即为:-1546188288.
2.2 m>>n的含义
表示将m的二进制数右移n位,正数高位补0,负数高位补1。 实例: 3>>2剖析: 3二进制形式: 00000000 00000000 00000000 00000011,按照$2的原理,得到00000000 00000000 00000000 00000000,即为0.-3>>2剖析:
-3二进制形式: 11111111 11111111 11111111 11111101,按照$2的原理,得到11111111 11111111 11111111 11111111,即为-1.
以上:每 个整数表示的二进制都是32位的,如果右移32位和右移0位的效果是一样的。依次类推,右移32的倍数位都一样。
备注:对于右移32位与右移0位是结果是一样的,我一直不能够理解。现在我只能理解为32比较特殊。相当于整体全移。与移0位相同。左移也是一样的。
2.3 m>>>n的含义
表示不管m是正数函数负数,高位全部补0实例:
3>>>2剖析:
3二进制形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即为0.
-3>>>2剖析:
-3二进制形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即为1073741823.
综上所述:
m<<n即在数字没有溢出的前提下,对于正数和负数,左移n位都相当于m乘以2的n次方.
m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。如果结果为小数,此时会出现两种情况:(1)如果m为正数,得到的商会无条件 的舍弃小数位;(2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。
3、位移操作的效率
接 下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。比如:a*2,
1.jvm先为变量a分配空间;
2.再进行a*2的操作;
3.再把结果返回给相应的变量。
而 a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数
进行操作时可用。
4、& | ^
再 进行些许补充,谈到位操作,当然还要说到四个操作符:~(按位非),|(按位或),&(按位
与),^(按位异或),这些都是大学 计算机基础用法,对整数的二进制形式进行操作,然后再
转换为整数,具体操作如下。
1.~(按位非):【解义】对该整数的二进制形 式逐位取反。
~4:(一元操作符)
4的二进制形式为:00000000 00000000 00000000 00000100,逐位取反后得
到:11111111 11111111 11111111 11111011,即为-5.
2.| (按位或):【解义】对两个整数的二进制形式逐位进行逻辑或运算,原理为:1|0=1,0|0=0,1|1=1,0|1=1
等。
4|-5:
4的二进制形式为:00000000 00000000 00000000 00000100,
-5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑或运算:11111111 11111111 11111111 11111111,即得到-1.
3.&(按位与):【解义】对两个整数的二进制形式逐位进行逻辑与 运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。
4&-5:
4的二进制形式为:00000000 00000000 00000000 00000100,
-5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.
实际应用:可以把字节转换为整 数,-64&0xFF=192,也可以用八进制的形式,-64&0377=192、
其实0xFF和0377都表示的是整数255、
4.^(按 位异或):【解义】对两个整数的二进制形式逐位进行逻辑异或运算,原理:1^1=0,1^0=1,0^1=1,0^0=0.
4^-5:
4的二进制形式为:00000000 00000000 00000000 00000100,
-5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.
实际应用:按位异或可以比较两个数字是否相等,它利用 1^1=0,0^0=0的原理。 20^20==0
转自:http://aokunsang.javaeye.com/blog/615658
import java.util.ArrayList;
public class hex {
public static void main(String[] args) {
String x = Integer.toBinaryString(2);
System.out.println("x:" + x);
int i = 2;
ArrayList<Integer> tempList = new ArrayList<Integer>();
while (i > 0) {
if (i == 1) {
tempList.add(i);
break;
}
tempList.add(i % 2);
i = i / 2;
}
for (int j = tempList.size() - 1; j >= 0; j--) {
System.out.print(tempList.get(j));
}
}
}
相关文章
- 暂无相关文章
用户点评