java中的位运算
位运算是对整数的二进制位进行操作的一种运算。在java中long, int, short, char和byte类型都可以使用位运算。
位运算的过程如下:首先将十进制整数转换成二进制表示形式,然后将位运算符应用于每个二进制数位,并计算结果。最后,将二进制结果转换回其十进制表示。
位运算符有以下几种:与运算(&)、或运算(|)、异或运算(^)、取反运算(~)、左移(<<)、右移(>>)等。下面来分别看下每个运算。
移位运算
移位运算有三种
左移(<<):将二进制位向左移动指定的位数,右侧用0填充。
int a = 5;//二进制101a = a << 1;//左移一位,右补0 = 1010,换算成10进制变成10System.out.println(a);
右移(>>):将二进制位向右移动指定的位数,保持符号位。
int b = 8;//二进制 100b = b >> 1;//右移一位,变成 10 转成十进制=4System.out.println(b);
无符号右移(>>>):将二进制位向右移动指定的位数,左侧用0填充,不考虑符号位。
我们知道对于有符号整数,第一位为符号位。正数符号位为0,负数的符号位为1。这里无符号右移左侧补0会将负数变成一个正数。原来是正数的数无符号右移和普通的右移没有区别。
int a = -8; // 二进制: 1111...1000
int result = a >>> 1; // 结果: 2147483644 (0111...1100)
移位运算整体还是比较好理解,左移相当于将数字乘以2的移位数次方。右移相当于将数字除以2的移位数次方,向下取整。
与运算(&)
它对两个整数的二进制位进行操作,只有在两个对应的二进制位都为1时,结果才为1;否则结果为0。
假设有两个整数 a
和 b
:
a = 5
(二进制表示为0101
)b = 3
(二进制表示为0011
)
进行与运算:
0101 (5)
& 0011 (3)
--------0001 (1)
通过与运算提取特定的位。也可以用来判断某些标志位是否被设置。
判断奇偶
isOdd(int a){return 1 == (a&1);
}
将要判断的数与1进行取与操作,只要结果为1则判断当前数为奇数。因为如果结果为1,则证明当前数二进制最后一位为1,是个奇数。
权限控制
权限控制这里可以结合linux文件系统的三个权限,rwx 即 读(1),写(2),执行(4)。
linux 可以使用chmod 来给用户赋予权限 ,7代表所有权限,5代表读和执行权限,大致可以根据以下与运算来判断是否有某个权限:
int READ = 1; // 0001
int WRITE = 2; // 0010
int EXECUTE = 4; // 0100int userPermissions = 5; // 0101 (具有读和执行权限)boolean canRead = (userPermissions & READ) != 0; // 检查读权限
boolean canWrite = (userPermissions & WRITE) != 0; // 检查写权限System.out.println("Can read: " + canRead); // 输出: Can read: true
System.out.println("Can write: " + canWrite); // 输出: Can write: false
清零特定位
如数字15(1111),要将其第二位清理,只需15 & (1011=11)即可。
掩码计算
计算机网络中,有子网掩码,子网掩码 & IP地址就可以计算处当前计算机所处的网络。
例如局域网中,通常子网掩码255.255.255.0,假设某个IP地址为192.168.10.111则将两者进行与运算后结果为192.168.10.0为当前ip所处的网络。
255的二进制是 11111111与任何一个8位以内的整数进行与运算都等于该数的本身。
相反0的二进制是0,与任何一个8位以内的二进制整数进行与运算结果都是0。
或运算(|)
或运算对两个二进制数的每一位进行比较,只要有一个位为 1,结果位就为 1;如果两个位都为 0,结果位为 0。
int a = 10; // 二进制: 1010int b = 12; // 二进制: 1100int result = a | b; // 结果: 1110 (十进制: 14)System.out.println(result); // 输出: 14
或运算可以用来进行一些状态标识。在游戏开发中,可以使用或运算来表示角色的状态。例如,角色可以同时处于多个状态,如“跳跃”、“攻击”等。
JUMPING = 1 # 0001
ATTACKING = 2 # 0010
DEFENDING = 4 # 0100# 角色当前状态为跳跃和攻击
character_state = JUMPING | ATTACKING # 结果: 0011# 检查角色是否在攻击
is_attacking = character_state & ATTACKING != 0 # 结果为 True
异或运算(^)
异或运算当两个对应的二进制位不相同,结果为1;相同则为0。
- 0^0 = 0
- 0 ^ 1 = 1
- 1^ 0 = 1
- 1 ^ 1 = 0
int a = 10; // 二进制: 1010int b = 12; // 二进制: 1100int result = a ^ b; // 结果: 0110 (十进制: 6)System.out.println(result); // 输出: 6
异或运算有以下特点:
a^a = 0 :一个数与自己进行异或结果为0。
a^0=a : 以数与0进行异或操作结果为其本身。
abb=a:对一个值进行两次异或运算使用同一个数,可以恢复到原始值。这使得异或运算在加密和解密中非常有用。因为这样运算是可逆的。
异或运算与运算的顺序无关,abb=a 等价于 a(bb) = a ^0=a
使用异或运算进行两个数值交换
int a = 5;int b = 3;a = a^b;b = a^b; //a = a^b 代入 b = a^b^b = a 现在b=a = 3a = a^b; //此时b=a ,a= a^b 带入 a^b^a = bSystem.out.println(a+" "+b);
找出数组中只出现一次的元素
int[] arr = {5,2,3,2,4,5,4};int result = 0;for (int i : arr) {result ^= i;}System.out.println(result);
这里使用了异或运算的对一个值进行两次相同异或运算等于同一个数
取反运算(~)
取反运算将每个二进制位取反,0变成1,1变成0。
int a = 8;//0000 1000/**取反后 1111 01111111 0111 是负数的补码表示形式,要得到其对应的十进制数,我们需要将其转换为正数。负数的补码是将其绝对值的二进制表示取反后加 1,所有最后结果是-9*/System.out.println(~a);
位运算总结下如下表格:
A B A|B A&B A^B ~A
0 0 0 0 0 1
1 0 1 0 1 0
0 1 1 0 1 1
1 1 1 1 0 0
相关文章:
java中的位运算
位运算是对整数的二进制位进行操作的一种运算。在java中long, int, short, char和byte类型都可以使用位运算。 位运算的过程如下:首先将十进制整数转换成二进制表示形式,然后将位运算符应用于每个二进制数位,并计算结果。最后,将…...

llamafactory0.9.0微调qwen2vl
LLaMA-Factory/data/README_zh.md at main hiyouga/LLaMA-Factory GitHubEfficiently Fine-Tune 100+ LLMs in WebUI (ACL 2024) - LLaMA-Factory/data/README_zh.md at main hiyouga/LLaMA-Factoryhttps://github.com/hiyouga/LLaMA-Factory/blob/main...

Electron 隐藏顶部菜单
隐藏前: 隐藏后: 具体设置代码: 在 main.js 中加入这行即可: // 导入模块 const { app, BrowserWindow ,Menu } require(electron) const path require(path)// 创建主窗口 const createWindow () > {const mainWindow ne…...

软件测试学习笔记丨curl命令发送请求
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32332 一、简介 cURL是一个通过URL传输数据的,功能强大的命令行工具。cURL可以与Chrome Devtool工具配合使用,把浏览器发送的真实请求还原出来,附带认证信…...

STM32+PWM+DMA驱动WS2812 —— 2024年9月24日
一、项目简介 采用STM32f103C8t6单片机,使用HAL库编写。项目中针对初学者驱动WS2812时会遇到的一些问题,给出了解决方案。 二、ws2812驱动原理 WS2812采用单线归零码的通讯方式,即利用高低电平的持续时间来确定0和1。这种通信方式优点是只需…...

MMD模型及动作一键完美导入UE5-IVP5U插件方案(二)
1、下载并启用IVP5U插件 1、下载IVP5U插件, IVP5U,点击Latest下载对应引擎版本,将插件放到Plugins目录,同时将.uplugin文件的EnableByDefault改为false 2、然后通过Edit->Plugins启用插件 2、导入pmx模型 1、直接在Content的某个目录拖入pmx模型,选择默认参数 2、…...

C++函数指针
函数指针是将一个函数赋值给一个变量的方法 我们使用函数的方法,可能会给函数传入参数,或者传入参数,函数可能有返回值,也可能没有返回值(void) 下面这个例子,我们调用了HelloWorld函数 auto关…...

汽车信息安全 -- 再谈车规MCU的安全启动
目录 1. 安全启动流程回顾 1.1 TC3xx的安全启动 1.2 RH850的安全启动 1.3 NXP S32K3的安全启动 1.4 小结 2.信任链的问题 3.国产HSM IP的拓展 今天接着 汽车信息安全 -- 存到HSM中的密钥还需包裹吗?-CSDN博客这篇文章深究另一个重要功能-- 安全启动。 该文章…...

[Linux]从零开始的Linux的远程方法介绍与配置教程
一、为什么需要远程Linux 相信大家在学习Linux时,要么是使用Linux的虚拟机或者在物理机上直接安装Linux。这样确实非常方便,我们也能直接看到Linux的桌面或者终端。既然我们都能直接看到终端或者Linux的桌面了,那我们为什么还要远程Linux呢&a…...

手机改IP地址怎么弄?全面解析与操作指南
在当今数字化时代,IP地址作为设备在网络中的唯一标识,其重要性不言而喻。有时候,出于隐私保护、网络访问需求或其他特定原因,我们可能需要更改手机的IP地址。然而,对于大多数普通用户来说,如何操作可能还是…...
【React】useState 和 useRef:项目开发中该如何选择
如果你正踏入用 React 进行网页开发的世界,那你可能已经遇到了像 useState 和 useRef 这样的术语。这两个 Hook 在构建交互性和动态组件时起着至关重要的作用。 下面,我们将探讨它们是什么,它们的功能,它们的区别,并通…...
python装饰器用法
为什么用装饰器? 第一个原因是,使用装饰器可以提升代码复用,避免重复冗余代码。如果我有多个函数需要测量执行时间,我可以直接将装饰器应用在这些函数上,而不是给多个函数加上一样的代码。这样的代码既元余也不方便后…...

AI 写作太死板?原因竟然是这个!
有些同学跟我埋怨说AI生成的文章太死板,一堆的“首先、其次、然后、再次、接着、总而言之……”,说话太官方,内容还很水。 想要让它模仿谁的语气,或者谁的文章,一点儿都不像。 名人都不模仿不了,更别说模…...
ansible实用模块
简介 ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。…...
【JavaScript】JIT
JIT实际上指,JS的编译过程、运行时。 Just in Time 在传统的编译语言里,比如JAVA、Go等,是提前编译的,它们的执行是先在本地编译出一个"东西",然后在放到服务器上运行。 提前编译的三大过程: …...

Matlab实现麻雀优化算法优化回声状态网络模型 (SSA-ESN)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新兴的群体智能优化算法,灵感来源于麻雀的觅食行为及其在面临危险时的预警机制。SSA通过模拟麻雀的这些自然行为来寻找问题…...

从 TCP Reno 经 BIC 到 CUBIC
重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章,感觉还是啰嗦了,今日重新一气呵成这个话题。 reno 线性逼近管道容量 Wmax,相当于一次查询(capacity-seeking),但长肥管道从 0.5*Wmax …...
工厂模式与建造者模式的区别
在软件设计中,工厂模式和建造者模式是两种常见的设计模式,它们都是用于创建对象,但是各自有不同的应用场景和目的。本文将通过餐馆点餐的例子,深入探讨这两种模式的区别。 工厂模式 工厂模式的核心思想是通过一个抽象工厂类来创…...

电脑usb接口封禁如何实现?5种禁用USB接口的方法分享!(第一种你GET了吗?)
“防患于未然,安全始于细节。”在信息技术飞速发展的今天,企业的信息安全问题日益凸显。 USB接口作为数据传输的重要通道,在带来便利的同时,也成为了数据泄露和安全风险的高发地。 因此,对电脑USB接口进行封闭管理&a…...

有效的括号
有效的括号 思路:我们先创建一个栈,让左括号入栈,与右括号判断 Stack stacknew Stack<>(); 将字符串中的符号转化为字符 char ch s.charAt(i); 完整代码如下: class Solution {public boolean isValid(String s) {if (s …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...