Java位运算应用

博客介绍了常见位运算,如与、或、非、异或、左右位移的定义及示例。重点阐述了与或运算在包含关系判断上的应用,包括定义、测试方法、结果验证位和原理;还提及异或运算在变量值交换方面的应用及测试方法。测试代码存于Github。

测试代码在Github

常见的位运算包括:与(&)、或(|)、非(~)、异或(^)、左位移(<<)、右位移(>>或>>>)

  • 与运算:运算符两边操作数同为1时结果为1,否则为0。例:1010 & 1100 = 1000,多位运算时按位与;
  • 或运算:运算符两边操作数同为0时结果为0,否则为1。例:1010 | 1100 = 1110,多位运算同上;
  • 非运算:对运算符右边的操作数按位取反,1变0,0变1。例:~1010 = 0101
  • 异或运算:运算符两边操作数按位同为1或0时结果为0,不同时为1。例:1010^1100 = 0110
  • 左位移运算:左丢弃最高位,0补最低位。例:1010<<2 = 1000,丢弃前两位10,低位补0;
  • 右位移运算:(>>)"有符号"右移,符号为正,高位补0,符号为负高位补1。(>>>)"无符号"右移,无论正负,高位补0;

与或运算应用

包含关系判断

定义:
    /** 0000 */
    private static final int FLAG_ONE = 0x1;
    /** 0010 */
    private static final int FLAG_TWO = 0x2;
    /** 0100 */
    private static final int FLAG_FOUR = 0x4;
    /** 1000 */
    private static final int FLAG_EIGHT = 0x8;

    /** 1000 */
    private static int TARGET1 = FLAG_ONE | FLAG_EIGHT;
    
    /** 1010 */
    private static int TARGET2 = FLAG_ONE | FLAG_TWO | FLAG_EIGHT;
  1. FLAG_ONE、FLAG_TWO、FLAG_FOUR、FLAG_EIGHT 二进制的值分别为0000、0010、0100、1000
  2. TARGET1与TARGET2为或运算结果
测试方法:
    private static void test1() {
        int result1 = TARGET1 & FLAG_ONE;
        System.out.println("result1 = " + result1);
        int result2 = TARGET1 & FLAG_TWO;
        System.out.println("result2 = " + result2);
        int result4 = TARGET1 & FLAG_FOUR;
        System.out.println("result4 = " + result4);
        int result8 = TARGET1 & FLAG_EIGHT;
        System.out.println("result8 = " + result8);
    }

result1、result2、result4、result8结果表示了TARGET1与四个FLAG值的与运算

结果验证位:
    result1 = 1
    result2 = 0
    result4 = 0
    result8 = 8

TARGET1是FLAG_ONE与FLAG_EIGHT的或运算结果,所以对应的result1、result8都不为0

原理:
    1111 | 0000 = 1111
    1111 & 0000 = 0000
    1111 & 1111 = 1111
    
    1010 | 0101 = 1111
    1111 & 1010 = 1010
    1111 & 0101 = 0101
    
    a | b = c
    c & a = a
    c & b = b

异或运算应用

变量值交换

测试方法:
    private static void test3() {
        int var1 = FLAG_ONE;
        int var2 = FLAG_TWO;
        System.out.println("var1 = " + var1 + "; var2 = " + var2);
        // 交换var1和var2的值
        var1 = var1 ^ var2;
        // a ^ a = 0
        // b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a
        var2 = var1 ^ var2;
        // a = a ^ (a ^ b) = (a ^ a) ^ b = 0 ^ b = b
        var1 = var2 ^ var1;
        System.out.println("==========swicth===========");
        System.out.println("var1 = " + var1 + "; var2 = " + var2);
    }
原理:
    a ^ a = 0
    a ^ 0 = a 
Java位运算有多种应用场景,以下为你详细介绍: ### 权限管理系统 位运算可用于实现轻量级、高效的权限管理系统。只需要一个整数(int/long)就可以表示多个权限,通过按位与(&)判断是否具有某个权限,添加、移除权限只需按位或(|)、异或(^)等操作。不过只适用于权限数量较少的情况(Java中int最多支持32位,long支持64位),不适合动态权限或权限过多的系统。 ```java public class PermissionManager { // 定义权限常量 public static final int PERMISSION_READ = 1; // 0001 public static final int PERMISSION_WRITE = 2; // 0010 public static final int PERMISSION_DELETE = 4; // 0100 private int permissions; // 添加权限 public void addPermission(int permission) { permissions = permissions | permission; } // 移除权限 public void removePermission(int permission) { permissions = permissions & ~permission; } // 检查是否有某个权限 public boolean hasPermission(int permission) { return (permissions & permission) == permission; } public static void main(String[] args) { PermissionManager manager = new PermissionManager(); manager.addPermission(PERMISSION_READ); manager.addPermission(PERMISSION_WRITE); System.out.println(manager.hasPermission(PERMISSION_READ)); // 输出: true System.out.println(manager.hasPermission(PERMISSION_DELETE)); // 输出: false } } ``` ### 位掩码 使用位运算提取或屏蔽某些特定位。例如提取一个整数的最低两位: ```java public class BitMaskExample { public static void main(String[] args) { int num = 7; // 二进制 0111 int mask = 3; // 二进制 0011 int result = num & mask; // 结果为 0011 -> 3 System.out.println(result); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值