详解Java 位运算

参考

一、概述

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,非运算后二进制结果(其实就是求反码)是 1110
0110(负数的二进制求其对应的十进制,减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 + " 是奇数");
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值