• Java中的7种位运算详解和应用


    在这里插入图片描述

    对byte、short类型进行位运算,
    会先转为int类型再运算,返回值也是int类型,
    对long类型进行位运算,返回值也是long类型。

    在这里插入图片描述

    计算机运算的时候,是将原码转换为补码进行的。

    正数的原码、反码、补码都一样的,负数的补码:
    我们以-1为例,byte类型占了1字节、8位。

    在这里插入图片描述

    注意:本文中所有关于位运算的示意图,为了方便用了8位的二进制来表示, 其实并不准确,int类型是4字节32位的。

    位运算

    &,两位同时为1时结果为1,否则为0。

    1^3=2
    在这里插入图片描述

    |,两位同时为0时结果为0,否则为1。

    1|3=3
    在这里插入图片描述

    异或

    ^,两位相等结果为0,不相等为1。

    1^3=2
    在这里插入图片描述

    ~,一元运算符,取反,即1返回0、0返回1。

    ~1=-2
    在这里插入图片描述

    左移

    <<,左移,按位左移,低位补0,溢出位忽略。

    -16<<2=-64
    在这里插入图片描述

    右移

    '>>,右移,按位右移,若正数高位补0,负数高位补1。

    -16>>2=-4
    在这里插入图片描述

    无符号右移

    '>>>,右移,按位右移,高位补0,溢出位忽略。

    16>>>2=4
    在这里插入图片描述

    应用

    判断奇偶性

    偶数最低位一定是0,奇数最低位一定是1。1只有最低位是1,其它位都是0,
    任何数和1进行与运算,除了最低位,其它位肯定得到0,以此判断奇偶性。

    127&1=1,127是奇数。
    在这里插入图片描述

    不使用中间变量完成互换

    我们需要知道:

    异或运算符合交换律,
    任何数和它本身进行异或运算结果都是0,
    任何数和0进行异或运算结果都是它本身。

    	public static void main(String[] args) {
    		int a = 3;
    		int b = 4;
    		
    		a = a ^ b;
    		b = b ^ a;
    		a = a ^ b;
    		
    		System.out.println(a);
    		System.out.println(b);
    	}
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    推导:

    a = a ^ b;
    b = b ^ a = b ^ (a ^ b) = b ^ b ^ a = 0 ^ a = a;
    a = a ^ b = (a ^ b) ^ (b ^ (a ^ b)) = (a ^ a) ^ (b ^ b) ^ b = b;
    
    • 1
    • 2
    • 3

    异或加解密

    原理同上。

    package com.example.duohoob.hash;
    
    public class HashMapTest {
    
    	public static void main(String[] args) {
    		// 加密key
    		int key = 1234567;
    		// 加密前的字符串
    		String str = "hello world";
    		
    		// 一次异或加密
    		byte[] bytes = str.getBytes();
    		for (int i = 0; i < bytes.length; i++) {
    			bytes[i] = (byte) (bytes[i] ^ key);
    		}
    		
    		// 加密后的字符串
    		String sign = new String(bytes);
    		System.out.println(sign);
    		
    		// 两次异或解密
    		for (int i = 0; i < bytes.length; i++) {
    			bytes[i] = (byte) (bytes[i] ^ key);
    		}
    		System.out.println(new String(bytes));
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在这里插入图片描述

  • 相关阅读:
    1105 平台(空间)
    boost::bind 不能处理函数重载 (error: no matching function for call to 'bind')
    OpenGL:开放图形库
    windows10安装MongoDB基础详细教程
    docker_重装mysql
    Android入门第15天-Android各版本号对比
    其他word转化为PDF的方式
    Kotlin 协程 - 生命周期 Job
    C/C++进程线程超详细详解
    C#.NET与JAVA互通之MD5哈希V2024
  • 原文地址:https://blog.csdn.net/qq_35549286/article/details/126286748