Java - 位运算的基本原理和用途

Java - 位运算的基本原理和用途

  • 前言
  • 一. Java 位运算基本操作
    • 1.1 按位与 &
    • 1.2 按位或 |
    • 1.3 按位异或 ^
    • 1.4 按位取反 ~
    • 1.5 位移运算
      • 1.5.1 左移运算符 <<
      • 1.5.2 右移运算符 >>
      • 1.5.3 无符号右移运算符 >>>
  • 二. 位运算实际运用
    • 2.1 判断奇偶性(&的运用)
    • 2.2 交换两个数的值(^的运用)
    • 2.3 2的幂运算(<< 的运用)
    • 2.4 判断一个数是否是2的幂次方(&的运用)
    • 2.5 加解密操作(^的运用)

前言

Java 当中的位运算有很多种,它们都是针对二进制位进行操作。包括:

  • 按位与:&
  • 按位或: |
  • 按位异或: ^
  • 取反:~
  • 左移位、右移位运算符:<< ,>> ,>>>

接下来我们就复习一下相关的运算知识。

一. Java 位运算基本操作

1.1 按位与 &

按位与:两个二进制数对应位上的数字都为1时,结果位上的数字才为1。否则结果位上的数字为0。按位与通常用于掩码操作或清零操作。

举例如下:

3的二进制表示为:0 0 1 1
5的二进制表示为:0 1 0 1
那么3 & 5 则表示为:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
最终结果为:
0011 & 0101 = 0001 = 1

按位与 常见的运用有:

  • 判断一个数是否为奇数n & 1 ==1 代替 (n % 2 == 1)
  • 清除一个数的二进制末尾 n 位:x & (~0 << n)

1.2 按位或 |

按位或:二进制数对应位上的数字有一个为1时,结果位上的数字就为1

举例如下:

3的二进制表示为:0 0 1 1
5的二进制表示为:0 1 0 1
那么3 | 5 则表示为:
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
最终结果为:
0011 | 0101 = 0111 = 7

按位或 常用的运用有:

  • 将一个数的二进制末n位设置为1:x | ((1 << n) - 1)

1.3 按位异或 ^

按位异或:两个二进制数对应位上的数字不相同时,结果位上的数字为1;否则结果位上的数字为0。

举例如下:

3的二进制表示为:0 0 1 1
5的二进制表示为:0 1 0 1
那么3 ^ 5 则表示为:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
最终结果为:
0011 | 0101 = 0110 = 6

按位异或 常见的运用有:

  • 加解密操作。

还有常见的运算公式:

  • x ^ 0 = x​
  • x ^ 1 = ~x

1.4 按位取反 ~

按位取反:是指一个二进制数的每个位取反,即0变成1,1变成0。说简单点,对于一个二进制数,取反后的值也就是数值加1后取反数 : ~n = (n+1) * -1

举例如下:

3的二进制表示为:0000 0000 0000 0000 0000 0000 0000 0011
按位取反操作会将每一位取反,即将0变为1,将1变为0。所以,对3进行按位取反的结果为:
1111 1111 1111 1111 1111 1111 1111 1100
这个二进制数表示的是一个负数,根据补码的规则,我们需要将其转换为原码来得到对应的十进制数。转换原码的方法是将补码的每一位取反,然后再加1
对于
1111 1111 1111 1111 1111 1111 1111 1100
取反得到
0000 0000 0000 0000 0000 0000 0000 0011
再加1得到
0000 0000 0000 0000 0000 0000 0000 0100,
即十进制数-4

1.5 位移运算

位移运算分为:

  • 左移运算符(<<
  • 右移运算符(>>
  • 无符号右移运算符(>>>

注意:没有 <<< 这种运算符的哦~

1.5.1 左移运算符 <<

左移运算符:将操作数的二进制表示向左移动指定的位数,右侧用0填充。例如,a << b表示将a的二进制表示向左移动b位。

举例如下:

3 << 2 = 12
3 的二进制表示为 0011
3 << 2 的运算过程如下:
0011 -> 1100
因此,3 << 2 = 12

说白了就是这个数乘以2的几次幂。

1.5.2 右移运算符 >>

右移运算符 :将操作数的二进制表示向右移动指定的位数,左侧用符号位(即正负号位)填充。例如,a >> b表示将a的二进制表示向右移动b位。

举例如下:

-6 >> 1 = -3
-6 的二进制表示为
1111 1111 1111 1111 1111 1111 1111 1010
-6 >> 1 的运算过程如下:(关注后面的1010 --> 1101),101 整体向右移动了一位,左侧由1填充。
1111 1111 1111 1111 1111 1111 1111 1101
因此,-6 >> 1 = -3

说白了就是这个数除以2的几次幂。 (取整)

  • 如果操作数是负数:右移操作会在左侧用1填充。
  • 如果操作数是正数,右移操作会在左侧用0填充

1.5.3 无符号右移运算符 >>>

无符号右移运算符 :将操作数的二进制表示向右移动指定的位数,左侧用0填充。无符号右移运算符不考虑符号位,所以无论操作数是正数还是负数,都会将左侧的位数填充为0。例如,a >>> b表示将a的二进制表示向右移动b位。

和右移运算符的区别就是:

  • 无论是正数还是负数:右移操作会在左侧都用0填充。

例如:6 >>> 1 = 6 / 2¹ = 3

二. 位运算实际运用

2.1 判断奇偶性(&的运用)

一个数和1做按位与操作,返回结果是1代表奇数,否则偶数。

n & 1 == 1

2.2 交换两个数的值(^的运用)

将两个数字异或比较3次即可。

public static void main(String[] args) {
    int a = 3, b = -7;
    System.out.println("a= " + a + ",b= " + b);
    a ^= b;
    b ^= a;
    a ^= b;
    System.out.println("a= " + a + ",b= " + b);
}

结果如下:
在这里插入图片描述

2.3 2的幂运算(<< 的运用)

给定一个数,想要乘以2的几次m幂:例如3 * 2 的六次幂 = 192,可表示为:

3 << 6

2.4 判断一个数是否是2的幂次方(&的运用)

对于一个正整数 n,如果它是 2 的幂次方,则有 n & (n - 1) == 0

2.5 加解密操作(^的运用)

private static final String TOKEN = "as21312b&*@#";

public static String encrypt(String str) {
    char[] chars1 = str.toCharArray();
    char[] chars2 = TOKEN.toCharArray();
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < chars1.length; i++) {
        builder.append((char) (chars1[i] ^ chars2[i % chars2.length]));
    }
    return builder.toString();
}

public static String decrypt(String str) {
    return encrypt(str);
}

public static void main(String[] args) {
    String str = "Hello World";
    // 加密
    String encrypt = encrypt(str);
    System.out.println(encrypt);
    // 解密
    System.out.println(decrypt(encrypt));
}

运行结果如下:
在这里插入图片描述
上面是一个简单的案例,你也可以在他的基础上,多加一层判断,比如:

  • 防止二次加密。
  • 没有加密的字符串经过解密后还是原字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/162951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 插槽 v-slot

插槽 视频链接&#xff1a;尚硅谷vue-插槽章节 不使用插槽的情况下 结果&#xff1a; 1 默认插槽 在子组件中只能有一个 结果&#xff1a; 2 具名插槽 #b是v-slot:b 的缩写 顾名思义就是指着名字去插入 结果&#xff1a; 3 作用域插槽 可以传递数据的插槽&#…

【SQL server】数据库、数据表的创建

创建数据库 --如果存在就删除 --所有的数据库都存在sys.databases当中 if exists(select * from sys.databases where name DBTEST)drop database DBTEST--创建数据库 else create database DBTEST on --数据文件 (nameDBTEST,--逻辑名称 字符串用单引号filenameD:\DATA\DBT…

【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑

作者:chlorine 专栏:c专栏 赋值运算符重载()()():实现完整的日期类(上) 我走的很慢&#xff0c;但我从不后退。 【学习目标】 日期(- - --)天数重载运算符 日期-日期 返回天数 对日期类函数进行优化(不符合常理的日期&#xff0c;负数&#xff0c;const成员)c中重载输入cin和输…

C/C++数据结构之中缀表达式转换为后缀表达式,删除堆栈元素

在这篇博客中&#xff0c;我们将深入分析一个使用C编写的栈和表达式计算程序。该程序不仅实现了基本的栈操作&#xff0c;还提供了中缀表达式转后缀表达式和删除堆栈中的元素等实用功能。通过逐一讲解每个函数的功能&#xff0c;我们将更全面地理解这个程序的实现。 资源获取&a…

python算法例15 合并数字

1. 问题描述 给出n个数&#xff0c;将这n个数合并成一个数&#xff0c;每次只能选择两个数a、b合并&#xff0c;合并需要消耗的能量为ab&#xff0c;输出将n个数合并成一个数后消耗的最小能量。 2. 问题示例 给出[1&#xff0c;2&#xff0c;3&#xff0c;4]&#xff0c;返回…

【漏洞复现】通达oa 前台sql注入

漏洞描述 通达OA(Office Automation)是一款企业级协同办公软件,旨在为企业提供高效、便捷、安全、可控的办公环境。它涵盖了企业日常办公所需的各项功能,包括人事管理、财务管理、采购管理、销售管理、库存管理、生产管理、办公自动化等。通达OA支持PC端和移动端使用,可以…

比亚迪刀片电池与特斯拉4680电池比较

1 电池材料 比亚迪刀片电池采用的磷酸铁锂LFP&#xff08;LiFePO4&#xff09;&#xff0c;特斯拉的4680电池采用的三元锂。 磷酸铁锂&#xff1a;循环寿命长&#xff0c;安全性能好&#xff0c;价格低廉&#xff0c;但是能量密度低&#xff0c;导电性能差&#xff0c;低温表现…

【机器学习算法】机器学习:支持向量机(SVM)

转载自&#xff1a; 【精选】机器学习&#xff1a;支持向量机&#xff08;SVM&#xff09;-CSDN博客 1.概述 1.1&#xff0c;概念 支持向量机&#xff08;SVM&#xff09;是一类按监督学习方式对数据进行二元分类的广义线性分类器&#xff0c;其决策边界是对学习样本求解的最…

window系统vscode 编译wvp前端代码

下载代码 wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;负责实现核心信令与设备管理后台部分&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtmp等…

应用场景丨迭代市政综合管廊监测系统建设

市政综合管廊是指在城市地下建造的隧道空间&#xff0c;将市政、电力、通讯、燃气、给排水等各种管线集于一体&#xff0c;实施统一规划、设计、建设和管理。综合管廊有利于解决反复开挖路面、架空线网密集、管线事故频发等问题&#xff0c;是保障城市运行的重要基础设施和“生…

CAS源码工程搭建记录

CAS源码工程搭建 1.下载2.gradle下载源改为阿里云&#xff0c;解决下载慢的问题3.解决保存 1.下载 git clone -b 5.3.x https://gitee.com/mirrors/CAS.git如果下载的是压缩包&#xff0c;导入工程会保存&#xff0c;因为builder.gradle的第20行开始有取git信息&#xff0c;如…

【Web】PHP反序列化的一些trick

目录 ①__wakeup绕过 ②加号绕过正则匹配 ③引用绕过相等 ④16进制绕过关键词过滤 ⑤Exception绕过 ⑥字符串逃逸 要中期考试乐(悲) ①__wakeup绕过 反序列化字符串中表示属性数量的值 大于 大括号内实际属性的数量时&#xff0c;wakeup方法会被绕过 &#xff08;php5-p…

汽车级低压差稳压器LDO LM317BD2TR4G原理、参数及应用

LM317BD2TR4G主要功能特性分析 &#xff1a; LM317BD2TR4G 低漏 (LDO) 线性电压稳压器是一款可调 3 端子正向 LDO 电压器&#xff0c;能够在 1.2 V 至 37 V 的输出电压范围内提供 1.5 A 以上的电流。此电压稳压器使用非常简便&#xff0c;仅需两个外部电阻即可设置输出电压。另…

sentinel 网关

网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。 这样的架构&#xff0c;会存在…

组合模式 rust和java的实现

文章目录 组合模式介绍实现javarsut 组合模式 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计…

Java20新增特性

版本介绍 Java 20是在2023年3月21日发布的&#xff0c;发布公司是甲骨文。这是标准Java的最新升级&#xff0c;提供了一系列的新特性和改进&#xff0c;以帮助开发者更高效地编写和维护代码。 版本特性 以下是一些Java 20的新特性&#xff1a; 局部变量类型推断 &#xff1a…

vscode 推送本地新项目到gitee

一、gitee新建仓库 1、填好相关信息后点击创建 2、创建完成后复制 https&#xff0c;稍后要将本地项目与此关联 3、选择添加远程存储库 4、输入仓库地址&#xff0c;选择从URL添加远程存储仓库 5、输入仓库名称&#xff0c;确保仓库名一致

春秋云境靶场CVE-2022-28512漏洞复现(sql手工注入)

文章目录 前言一、CVE-2022-28512靶场简述二、找注入点三、CVE-2022-28512漏洞复现1、判断注入点2、爆显位个数3、爆显位位置4 、爆数据库名5、爆数据库表名6、爆数据库列名7、爆数据库数据 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。…

【vue实战项目】通用管理系统:首页

前言 本文为博主的vue实战小项目系列中的第三篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装to…

【Unity小技巧】图片使用的一些常见问题

文章目录 前言Button不规则按钮点击空白区域不响应点击事件1. 设置资源参数2. 代码设置按钮Image的alphaHitTestMinimumThreshold3. 解释&#xff1a;4. 效果 Unity Image 原图比例控制方法一 Preserve Aspect1. 设置勾选Preserve Aspect&#xff08;保持长宽比&#xff09;&am…