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

news2024/12/23 13:29:52

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.coloradmin.cn/o/1223703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DB9串口引脚介绍

一、公头和母头 图片示意源于网络: 二、 每个引脚的功能定义 公头&#xff1a;所有排针式的接头&#xff08;5针朝上&#xff0c;从左到右序号依次是1~9&#xff09; 母头&#xff1a;所有插槽式的接孔&#xff08;5孔朝上&#xff0c;从右到左序号依次是1~9&#xff09; 针…

计算机毕业设计选题推荐-掌心办公微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Web与DNS综合实验

目录 题目&#xff1a; 步骤一&#xff1a;准备工作 步骤二&#xff1a;在server端搭建简单网页 步骤三&#xff1a;node1端的DNS解析配置 步骤五&#xff1a;node2端进行测试。 题目&#xff1a; 1.打开3个主机&#xff0c;server、node1、node2 2.server为web主机建立网…

typora使用PicGo自动上传图片到chevereto图床

typora使用PicGo自动上传图片到chevereto图床 近期发现&#xff0c;gitee图床不能用了。github又涉及科学上网。搜索了开源图床方案&#xff0c;找到了chevereto&#xff0c;使用起来还不错。分享给大家。 文章目录 typora使用PicGo自动上传图片到chevereto图床chevereto图床安…

轻量级 Java 日志组件

日志记录功能在开发中很常用&#xff0c;不仅可以记录程序运行的细节&#xff0c;方便调试&#xff0c;也可以记录用户的行为&#xff0c;是框架中不可或缺的组件。为最大程度复用现有的组件&#xff0c;我们就地取材使用了 JDK 自带的 JUL&#xff08;java.util.logging&#…

Linux--初识和几个简单的指令(1)

目录 前言 0.什么是操作系统 0.1 搭建 Linux 环境 0.2搭建 Linux 环境小结 1.使用 XShell 远程登录 Linux 1.1关于 Linux 桌面 1.2下载安装 XShell 1.3查看 Linux 主机 ip 1.4XShell 下的复制粘贴 2.Linux下基本指令 2.1 pwd命令 2.2 ls命令 2.3 mkdir指令 2.4 cd…

Linux上编译和安装SOFA23.06

前言 你可以直接使用编译安装好的SOFA版本Installing from all-included binaries (v23.06.00)&#xff1a; 如果你想自己编译&#xff0c;可以看我下面写的内容&#xff0c;不过绝大多数是从官网来的&#xff0c;如果和官网有出入&#xff0c;建议还是以官网为准。 在Linux下…

josef约瑟 时间继电器 ST3PA-A AC220V 带插座PF085A

ST3P系列时间继电器适用于交流50Hz或60Hz,额定电压380V及以下或直流24V的控制电路中作廷时元件,按预定的时间接通或分断电路。具有体积小,精度高,延时范围宽,可与JSZ3系列继电器等同互换使用。 系列型号 ST3PF-2Z(JSZ3F-2Z) 5s AC110V ST3PF(JSZ3F) 10s AC48V ST3PC-1(AH3-3)…

IJ中配置TortoiseSVN插件:

文章目录 一、报错情况&#xff1a;二、配置TortoiseSVN插件&#xff1a; 一、报错情况&#xff1a; 由于公司电脑加密&#xff0c;TortoiseSVN菜单没有提交和更新按钮&#xff0c;所以需要使用IJ的SVN进行代码相关操作 二、配置TortoiseSVN插件&#xff1a; 需要设置一个svn.…

Go 之 captcha 生成图像验证码

目前 chptcha 好像只可以生成纯数字的图像验证码&#xff0c;不过对于普通简单应用来说也足够了。captcha默认将store封装到内部&#xff0c;未提供对外操作的接口&#xff0c;因此使用自己显式生成的store&#xff0c;可以通过store自定义要生成的验证码。 package mainimpor…

LINUX入门篇【6】----第一个LINUX小程序---进度条及相关知识讲解

前言&#xff1a; 本篇我们将开始尝试构建我们的第一个LINUX的小程序----进度条作为一个十分常见的程序&#xff0c;在我们之后的工程实践中也是需要多次运用&#xff0c;但是介于我们目前还没有去学习网络等方面的知识&#xff0c;没法独立的去利用程序去下载一个真正的程序&…

【Proteus仿真】【Arduino单片机】LM35温度计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、LM35传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示传感器检测温度。 二、软件设计 /* 作者&a…

场景交互与场景漫游-路径漫游(7)

路径漫游 按照指定的路径进行漫游对一个演示是非常重要的。在osgViewer中&#xff0c;当第一次按下小写字母“z”时&#xff0c;开始记录动画路径;待动画录制完毕&#xff0c;按下大写字母“Z”&#xff0c;保存动画路径文件;使用osgViewer读取该动画路径文件时&#xff0c;会回…

Cadence virtuoso drc lvs pex 无法输入

问题描述&#xff1a;在PEX中的PEX options中 Ground node name 无法输入内容。 在save runset的时候也出现无法输入名称的情况 解决办法&#xff1a; copy一个.bashrc文件到自己的工作目录下 打开.bashrc文件 在.bashrc中加一行代码&#xff1a;unset XMODIFIERS 在终端sour…

java使用 TCP 的 Socket API 实现客户端服务器通信

一&#xff1a;什么是 Socket(套接字) Socket 套接字是由系统提供于网络通信的技术, 是基于 TCP/IP 协议的网络通信的基本操作&#xff0c;要进行网络通信, 需要有一个 socket 对象, 一个 socket 对象对应着一个 socket 文件, 这个文件在 网卡上而不是硬盘上, 所以有了 sokcet…

模块一、任务一.数据分析概述

一、module1 预测未来-总统大选 样本偏差 二、module2 优化现状-化妆品销售 1、数据分析师从业务类型上划分 2、目标&#xff1a;总销量 达到 目标销量 3、固定基本流程 &#xff08;1&#xff09;确定 一、目标值节节升高&#xff0c;是否合理&#xff1f;根据什么定的&…

【火炬之光-魔灵装备】

文章目录 装备天赋追忆石板技能魂烛刷图策略 装备 头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注盾牌其余的装备要么是召唤物生命&#xff0c;要么是技能等级&#xff0c;鞋子的闪电技能等级加2不是核心&#xff0c;腰带的话主要是要冷却有冷却暗影的技能是不会断的&#xff…

“腾易视连”构建汽车生态新格局 星选计划赋能创作者价值提升

11月16日&#xff0c;在2023年广州国际车展前夕&#xff0c;以“腾易视连&#xff0c;入局视频号抓住增长新机会”为主题的腾易创作者大会在广州隆重举办。此次大会&#xff0c;邀请行业嘉宾、媒体伙伴、生态伙伴、视频号汽车领域原生达人等共济一堂&#xff0c;结合汽车行业数…

多聚焦图像融合算法

# @File : PerfectFusion.py # @Author : ShawnWang # @Desc : 多焦点图像融合 # Time : 2023/9/24 08:25 import cv2 import matplotlib.pyplot as plt import numpy as np import pywt from PIL import Image# 基于小波变换的多聚焦图像融…