一、概述
java支持的位运算符包括:
&(按位与)、|(按位或)、~(按位非)、^(按位异或)、<<(左位移运算符)、>>(右位移运算符)、<<<(无符号右移运算符)
以上位运算符中,除~以外,其余均为二元运算符,操作数只能为整型和字符型数据;
二、位运算符
1、&(按位与)
当两边操作数的位同时为1时,结果为1,否则为0
栗子:25&40,25的二进制 0001 1001,40的二进制 0010 1000,与运算后的二进制为 1000,打印结果为十进制8
2、|(按位或)
当两边操作数的位只要有一边为1,结果为1,否则为0
栗子:25 | 40 ,或运算后的二进制 0011 1001,打印结果为十进制57
3、~(按位非)
0变1,1变0
栗子:~25,25的二进制是0001 1001,非运算后二进制结果(其实就是求反码)是 11100110(负数的二进制求其对应的十进制,减1取反求出对应整数,然后在前加负号),其最后的打印结果为十进制-26
4、^(按位异或)
两边的位不同时,结果为1,否则为0.
栗子:3^4,运算后打印的十进制结果为1
5、<<(左位移)
所有位都左移规定的次数,丢弃最高位,0补最低位
左移1位表示扩大2被,例如:m << n 则结果是 m乘2的n次方
栗子:2<<3结果为16
6、>>(右位移)
所有位都右移规定的次数,符号位不变,左边补上符号位
与左移相反,右移1位表示缩小2被,例如:m >> n 则结果是 m除以2的n次方
栗子:25>>2
7、>>>(无符号右移运算符)
无符号的意思是将符号位当作数字位看待,右移时符号位(最高位)也跟着变,低位溢出,高位补0
三、位运算的应用
简单示例
public static void main(String[] args) {
System.out.println("25的二进制位: " + Integer.toBinaryString(25));
System.out.println("40的二进制位: " + Integer.toBinaryString(40));
System.out.println("=======================================");
System.out.println("25|40的二进制结果: " + Integer.toBinaryString(25|40));
System.out.println("25|40的十进制结果: " + (25|40)); // 57
System.out.println("=======================================");
System.out.println("25&40的二进制结果: " + Integer.toBinaryString(25&40));
System.out.println("25&40的十进制结果: " + (25&40)); // 8
System.out.println("=======================================");
System.out.println("~25的二进制结果: " + Integer.toBinaryString(~25));
System.out.println("~25的十进制结果: " + (~25)); // -26
System.out.println("=======================================");
System.out.println("3^2的二进制结果: " + Integer.toBinaryString(3^2));
System.out.println("3^2的十进制结果: " + (3^2)); // 1
System.out.println("=======================================");
System.out.println("2<<3的二进制结果: " + Integer.toBinaryString(2<<3));
System.out.println("2<<3的十进制结果: " + (2<<3)); // 16
System.out.println("=======================================");
System.out.println("25>>2的二进制结果: " + Integer.toBinaryString(25>>2));
System.out.println("25>>2的十进制结果: " + (25>>2)); // 6
System.out.println("=======================================");
System.out.println("-1>>>1的结果是: " + (-1>>>1));
}
结果
25的二进制位: 11001
40的二进制位: 101000
=======================================
25|40的二进制结果: 111001
25|40的十进制结果: 57
=======================================
25&40的二进制结果: 1000
25&40的十进制结果: 8
=======================================
~25的二进制结果: 11111111111111111111111111100110
~25的十进制结果: -26
=======================================
3^2的二进制结果: 1
3^2的十进制结果: 1
=======================================
2<<3的二进制结果: 10000
2<<3的十进制结果: 16
=======================================
25>>2的二进制结果: 110
25>>2的十进制结果: 6
=======================================
-1>>>1的结果是: 2147483647
1、判断数的奇偶
奇数的二进制末尾一定是1,偶数一定是0,而1的int 32位二进制末尾是1,其余位是0,所以如果数num & 1 == 0则说明num的末尾是0,num是偶数,否则是奇数;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个正整数,并按回车来判断奇偶性(输入-1代表退出程序)");
while(sc.hasNext()) {
int num = sc.nextInt();
if (num == -1) {
break;
}
oddOrEven(num);
}
}
// 应用1:判断数的奇偶
public static void oddOrEven(int num) {
if ((num & 1) == 0) {
System.out.println(num + " 是偶数");
} else {
System.out.println(num + " 是奇数");
}
}