码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java中的7种位运算详解和应用


    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

    在这里插入图片描述

  • 相关阅读:
    【数据结构】模拟实现顺序表
    测试开发【Mock平台】11基础:拦截器服务实现(二)事半功倍的WebMvcConfigurer
    51单片机定时器基础知识
    Ajax学习:在edge中设置ie浏览器格式
    Gradient Descent
    STM32H750之FreeRTOS学习--------(六)FreeRTOS的列表和列表项
    SuperMap GIS基础产品FAQ集锦(20240617)
    break ,continue,retrun的区别
    商业智能BI与业务管理决策思维之三:业务质量分析
    Python 无废话-办公自动化Excel修改数据
  • 原文地址:https://blog.csdn.net/qq_35549286/article/details/126286748
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号