<返回更多

位运算及其妙用

2019-07-03    
加入收藏
位运算及其妙用

 

程序中的所有数在计算机内存中都是以二进制的形式储存的,即只有0和1两种数值,位运算就是直接对整数在内存中的二进制位进行。

1<<(向左位移)

运算规则:a<<b,表示a转为二进制后左移b位,左移后,空位补0。

例:

 3: 00000000 00000000 00000000 00000011
 // 左移2位,空位补2个0
 3<<2: 00000000 00000000 00000000 00001100

所以,3<<2 = 12

规律:a左移b位,就是a乘以2的b次方。

2>>(向右位移)

运算规则:a>>b,表示a转为二进制后右移b位,右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1。

例:

 4: 00000000 00000000 00000000 00000100
 // 右移1位。右移后,最高位是0,则空缺位补0;最高位是1,则空缺位补1
 4>>1 00000000 00000000 00000000 00000010

所以,4 >> 1 = 2

规律:a右移b位,就是a除以2的b次方。

3&(与运算)

运算规则:相同位的两个数字都为1,则为1;若有一个不为1,则为0。

例:

 5: 00000000 00000000 00000000 00000101
 6: 00000000 00000000 00000000 00000110
 5&6: 00000000 00000000 00000000 00000100 

所以,5&6 = 4

4|(或运算)

运算规则:相同位只要有一个为1即为1。

例:

 5: 00000000 00000000 00000000 00000101
 6: 00000000 00000000 00000000 00000110
 5|6: 00000000 00000000 00000000 00000111 

所以,5|6 = 7

5^(异或运算)

运算规则:针对二进制位,如果某位不同则该位为1, 否则该位为0。

例:

 5: 00000000 00000000 00000000 00000101
 6: 00000000 00000000 00000000 00000110
 5^6: 00000000 00000000 00000000 00000011 

所以,5^6 = 3

6~(取反运算)

运算规则:对二进制各位数进行取反,即1变成0,0变成1。

例:

 5: 00000000 00000000 00000000 00000101
 ~5: 11111111 11111111 11111111 11111010 // 补码形式
 11111111 11111111 11111111 11111001 // 反码
 10000000 00000000 00000000 00000110 // 原码

所以,~5 = -6

位运算的一些妙用

常规操作:

 void swap(int a, int b) {
 int temp = a;
 a = b;
 b = temp;
 }

骚操作:

 void swap(int a, int b) {
 a^=b;
 b^=a;
 a^=b;
 }

常规操作:

	if (a%2 == 0) {
		System.out.println("偶数");
	} else {
		System.out.println("奇数");
	}

骚操作:

	if ((a&1) == 0) {
		System.out.println("偶数");
	} else {
		System.out.println("奇数");
	}

常规操作:

	int average(int x, int y) { 
 return (x+y)/2; 
 } 

骚操作:

 int average(int x, int y) { 
 return (x&y)+((x^y)>>1); 
 } 
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>