欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java位运算符,

来源: javaer 分享于  点击 49657 次 点评:64

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<<2
3的二进制形式: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));
		}

	}
}



相关文章

    暂无相关文章
相关栏目:

用户点评