位运算

Java中的位运算包括 与、或、非、异或、移位。

Java中的上述运算都是把其他进制转为二进制来运算的。

与:代表按位与,都为1则结果为1,有一个为0则结果为0 ,相当于条件并且

或:按位或,只要有一个为1,则为1,都为0则为0 ,相当于条件或

非:按位取反

异或:相同为0,相反为1

移位:操作数按位左移或右移,其中左移n位相当于原数乘以2的n次幂,右移n位相当于原数除以2的n次幂

下面是具体运算:

public class Wei {

	public static void main(String[] args) {

		// 1、位与( & )
		// 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
		System.out.println(5 & 3);// 结果为1
		System.out.println(4 & 1);// 结果为0
		
		// 2、位或( | )
		// 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
		System.out.println(5 | 3);// 结果为7
		
		// 3、位非( ~ )
		// 操作数的第n位为1,那么结果的第n位为0,反之。
		System.out.println(~5);// 结果为-6 
		
		// 4、位异或( ^ )
		// 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
		 System.out.println(5 ^ 3);//结果为6 
		
		 // 5、左移( << )
		 // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0://
		 // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
		 System.out.println(5 << 2);// 运行结果是20 ,相当于5乘以2的平方
		 
		 // 6、右移( >> ) 高位补符号位
		 // 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
		 // 0000 0000 0000 0000 0000 0000 0000 0001
		 System.out.println(5 >> 2);// 运行结果是1, 相当于5除以2的平方
		 
		 // 7、无符号右移( >>> ) 高位补0
		 // 例如 -5换算成二进制后为:0101 取反加1为1011
		 // 1111 1111 1111 1111 1111 1111 1111 1011
		 // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
		 System.out.println(5 >> 3);// 结果是0
		 System.out.println(-5 >> 3);// 结果是-1
		 System.out.println(-5 >>> 3);// 结果是536870911
		 
	}
}

计算机可识别的为二进制数据,所以在代码中使用位运算会提高编程效率!

比如这个算法题:一个数组中只有一个数会只出现一次,其他所有数都出现两次,如何找出只出现一次的那个数

如果使用嵌套循环的话复杂度高,效率慢,但是用异或就可以,首先要明确异或运算a^b^a^b=(a^a)^(b^b);

public class Test {

	public static Integer findOnlyNum1(int[] array){  
	    int result = 0;  
	    for(int i = 0 ;i<array.length;i++){  
	        result^=array[i];  
	        System.out.println(result);
	    }  
	    return result;  
	}  
	
	public static void main(String[] args) {
		int[] array = {1,2,1,3,3,2,4,5,5,6,4,6,9,7,7,8,8};
		System.out.println("result="+findOnlyNum1(array));
	}
}

在比如下面这个例子:

如何找出一个正整数二进制中1的个数

首先要明白任何正整数和1按位与,那么只是正整数二进制的最后一位和1相与,例如5&1 即为 0101&0001=0001 结果为1

	public static int BitCount1(int n){
	    int c =0 ; // 计数器
	    for (c =0; n >0; n >>=1) // 循环移位
	        c += n &1 ; // 如果当前位是1,则计数器加1
	    return c ;
	}
	
	public static void main(String[] args) {
		// 5的二进制为 0101, 结果为2
		System.out.println("result="+BitCount1(5));
	}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值