详谈Java中的二进制及基本的位运算
什么是二进制
二进制是一种采用0和1两个数码表示数字的方法,被广泛应用于计算机科学领域。在Java中,可以用整型变量存储二进制数。
在Java中,整型变量默认采用十进制存储,但是可以采用其他进制的数字进行初始化。例如:
int num1 = 10; // 十进制
int num2 = 0b1010; // 二进制
int num3 = 012; // 八进制
int num4 = 0xA; // 十六进制
其中,0b开头表示二进制,0开头表示八进制,0x开头表示十六进制。
位运算符
Java中提供了以下位运算符,可以用于对二进制数进行操作:
- 按位与(&)
- 按位或(|)
- 按位异或(^)
- 按位取反(~)
- 左移(<<)
- 右移(>>)
- 无符号右移(>>>)
下面分别进行详细介绍。
按位与(&)
按位与运算符(&)的运算规则是:两个二进制数的对应位都为1时,该位结果为1,否则为0。
例如:
int num1 = 0b1010; // 二进制1010
int num2 = 0b1100; // 二进制1100
int num3 = num1 & num2; // 按位与运算,num3为二进制1000,即十进制8
按位或(|)
按位或运算符(|)的运算规则是:两个二进制数的对应位都为0时,该位结果为0,否则为1。
例如:
int num1 = 0b1010; // 二进制1010
int num2 = 0b1100; // 二进制1100
int num3 = num1 | num2; // 按位或运算,num3为二进制1110,即十进制14
按位异或(^)
按位异或运算符(^)的运算规则是:两个二进制数的对应位相同则为0,不同则为1。
例如:
int num1 = 0b1010; // 二进制1010
int num2 = 0b1100; // 二进制1100
int num3 = num1 ^ num2; // 按位异或运算,num3为二进制0110,即十进制6
按位取反(~)
按位取反运算符(~)的运算规则是:将所有二进制数的位取反(0变为1,1变为0)。
例如:
int num1 = 0b1010; // 二进制1010
int num2 = ~num1; // 按位取反运算,num2为二进制0101,即十进制5
左移(<<)
左移运算符(<<)的运算规则是:将二进制数向左移动指定位数,右边补0。
例如:
int num1 = 0b1010; // 二进制1010
int num2 = num1 << 2; // 左移两位,num2为二进制101000,即十进制40
右移(>>)
右移运算符(>>)的运算规则是:将二进制数向右移动指定位数,左边补原来的符号位。
例如:
int num1 = 0b1010; // 二进制1010
int num2 = num1 >> 2; // 右移两位,num2为二进制10,即十进制2
无符号右移(>>>)
无符号右移运算符(>>>)的运算规则是:将二进制数向右移动指定位数,左边补0。
例如:
int num1 = -10; // 十进制-10,二进制11111111111111111111111111110110
int num2 = num1 >>> 2; // 无符号右移两位,num2为二进制00111111111111111111111111111101,即1073741821
示例
示例1
需求:判断一个数是否是2的整数次幂。
实现代码如下:
public static boolean isPowerOfTwo(int num) {
return num > 0 && (num & (num - 1)) == 0;
}
该方法的原理是:如果一个数是2的整数次幂,那么它的二进制表示只有一位是1,其余位都是0。例如:2的二进制是10,4的二进制是100,8的二进制是1000,以此类推。
由于2的整数次幂的二进制表示只有一个1,那么这个数减去1之后,除了最高位的1,其余位都是0。例如:1的二进制是1,1-1=0,其二进制为0;2的二进制是10,2-1=1,其二进制为1;4的二进制是100,4-1=11,其二进制为11,以此类推。
那么,如果将一个2的整数次幂减去1后,与原来的数进行按位与运算,结果必然是0,因为它们的二进制只有1位是相同的。
示例2
需求:用最短的代码实现交换两个数的值。
实现代码如下:
public static void swap(int a, int b) {
a ^= b;
b ^= a;
a ^= b;
}
该方法的原理是:运用按位异或运算的交换律,a和b分别执行两次异或运算,就相当于a和b的值交换了。
总结
二进制和位运算在计算机科学领域中有着广泛的应用,掌握这些知识可以帮助我们更好地理解计算机的工作原理,提高程序的效率。在Java中,我们可以采用整型变量存储二进制数,并用位运算符操作这些数字。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详谈Java中的二进制及基本的位运算 - Python技术站