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));
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringSecurity5|12.实现RememberMe 及 实现原理分析

security/day08 这个功能大家还熟悉么&#xff1f;我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我&#xff01;&#xff01;&#xff01;不是让大家记住我哈。 值得一提的是&#xff0c;Spring Security 也提供了这个…

(C++)字符串相加

愿所有美好如期而遇 题目链接&#xff1a;415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09; 思路 我们看到字符串长度可能到达一万&#xff0c;而且不允许使用处理大整数的库&#xff0c;也就是说&#xff0c;转成整数相加后再转成字符串是不可行的。 那么我们就让…

LCD1602显示自定义字符

代码&#xff1a; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); //根据lcd1602的地址修改0x27. dht DHT; byte degree[8] {B00100, B01010, B10001, B10101, B10101, B01110, B00100,B00100 }; //自定义字符的2进制数据 byte customCh…

从0开始学习JavaScript--JavaScript 数字与日期

JavaScript中的数字和日期是处理数值计算和时间相关任务的核心。本文将深入研究JavaScript中数字的表示、常见运算&#xff0c;以及日期对象的创建、格式化等操作&#xff0c;并通过丰富的示例代码&#xff0c;可以更全面地了解和应用这些概念。 JavaScript数字基础 JavaScri…

Shell脚本:Linux Shell脚本学习指南(第一部分Shell基础)一

你好&#xff0c;欢迎来到「Linux Shell脚本」学习专题&#xff0c;你将享受到免费的 Shell 编程资料&#xff0c;以及很棒的浏览体验。 这套 Shell 脚本学习指南针对初学者编写&#xff0c;它通俗易懂&#xff0c;深入浅出&#xff0c;不仅讲解了基本知识&#xff0c;还深入底…

Python中,我们可以使用pandas和numpy库对Excel数据进行预处理,包括读取数据、数据清洗、异常值剔除等

文章目录 一、什么是数据预处理二、对excel数据进行详细的数据预处理操作总结 一、什么是数据预处理 数据预处理是一种对数据进行清洗、整理、转换等操作的过程&#xff0c;旨在提高数据质量&#xff0c;使其适应模型的需求&#xff0c;从而改进数据挖掘或机器学习的结果。 数…

如何在企业签名、超级签名、tf签名之间做选择

企业签名 (Enterprise Signing): 用途&#xff1a; 适用于企业内部发布应用&#xff0c;不需要经过App Store审核&#xff0c;可以通过企业内部渠道直接分发给员工或内部用户。限制&#xff1a; 仅限于企业内部使用&#xff0c;无法在App Store上发布或向外部用户分发。 超级签…

Alien Skin Exposure2024胶片滤镜中文免费版插件

Exposure是一个在你的照片上实现完整个人看法的终极工具。它是一个完整、强大、多才多艺的照片编辑器和组织者&#xff0c;并且带有你在市场上任何软件中都找不到的独特功能。 Alien Skin Exposure是我处理图片主要的一款软件。Exposure整体界面非常直观&#xff0c;而且操作易…

Linux常用命令——bye命令

在线Linux命令查询工具 bye 命令用于中断FTP连线并结束程序。。 补充说明 bye命令在ftp模式下&#xff0c;输入bye即可中断目前的连线作业&#xff0c;并结束ftp的执行。 语法 bye实例 bye在线Linux命令查询工具

多线程Thread(初阶一:认识线程)

目录 一、引用线程的原因 二、线程的概念 三、进程和线程的区别 四、多线程编程 一、引用线程的原因 多任务操作系统&#xff0c;希望系统能同时运行多个任务。所以会涉及到进程&#xff0c;需要对进程进行管理、调度等。 而单任务操作系统&#xff0c;就完全不涉及到进程…

判断序列值是否单调递增 PandasSeries中的方法:is_monotonic_increasing

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断序列值是否单调递增 PandasSeries中的方法&#xff1a; is_monotonic_increasing 选择题 请问下列程序运行的的结果是&#xff1a; import pandas as pd s1 pd.Series([1, 2, 5]) prin…

Portraiture2024PS/LR专用智能磨皮插件,AI算法美颜,提高P图效率

ps皮肤美白磨皮滤镜有吗&#xff1f;ps本身无自带美白磨皮滤镜&#xff0c;虽然部分滤镜有磨皮、提亮功能&#xff0c;但往往需要搭配蒙版、通道功能使用。但ps可安装第三方软件&#xff0c;比如常用的磨皮插件portraiture3&#xff0c;那么&#xff0c;磨皮插件portraiture3怎…