一、概述

java支持的位运算符包括:
&(按位与)、|(按位或)、~(按位非)、^(按位异或)、<<(左位移运算符)、>>(右位移运算符)、<<<(无符号右移运算符)
以上位运算符中,除~以外,其余均为二元运算符,操作数只能为整型和字符型数据;

二、位运算符

1、&(按位与)

当两边操作数的位同时为1时,结果为1,否则为0

栗子:25&40,25的二进制 0001 1001,40的二进制 0010 1000,与运算后的二进制为 1000,打印结果为十进制8

java 位数 基础类型 java 位与运算_运算符

2、|(按位或)

当两边操作数的位只要有一边为1,结果为1,否则为0

栗子:25 | 40 ,或运算后的二进制 0011 1001,打印结果为十进制57

java 位数 基础类型 java 位与运算_java 位数 基础类型_02

3、~(按位非)

0变1,1变0

栗子:~25,25的二进制是0001 1001,非运算后二进制结果(其实就是求反码)是 1110
0110(负数的二进制求其对应的十进制,减1取反求出对应整数,然后在前加负号),其最后的打印结果为十进制-26

java 位数 基础类型 java 位与运算_System_03

4、^(按位异或)

两边的位不同时,结果为1,否则为0.

栗子:3^4,运算后打印的十进制结果为1

java 位数 基础类型 java 位与运算_System_04

5、<<(左位移)

所有位都左移规定的次数,丢弃最高位,0补最低位

左移1位表示扩大2被,例如:m << n 则结果是 m乘2的n次方

栗子:2<<3结果为16

java 位数 基础类型 java 位与运算_System_05

6、>>(右位移)

所有位都右移规定的次数,符号位不变,左边补上符号位

与左移相反,右移1位表示缩小2被,例如:m >> n 则结果是 m除以2的n次方

栗子:25>>2

java 位数 基础类型 java 位与运算_System_06

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 + " 是奇数");
	}
}