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。

假设有两个整数 ab

  • 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

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

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

相关文章

YOLOv10改进,YOLOv10主干网络替换为VanillaNet( CVPR 2023 华为提出的全新轻量化架构),大幅度涨点

摘要 基础模型的核心理念是“更多即不同”,这一理念在计算机视觉和自然语言处理领域取得了惊人的成功。然而,变压器模型的优化挑战和固有复杂性呼唤一种向简化转变的范式。在本研究中,引入了 VanillaNet,一种拥抱设计优雅的神经网络架构。通过避免高深度、快捷方式和复杂操…

MySQL—存储过程详解

基本介绍 存储过程和函数是数据库中预先编译并存储的一组SQL语句集合。它们的主要目的是提高代码的复用性、减少数据传输、简化业务逻辑处理&#xff0c;并且一旦编译成功&#xff0c;可以永久有效。 存储过程和函数的好处 提高代码的复用性&#xff1a;存储过程和函数可以在…

记某地级市护网的攻防演练行动

0x1 前言 哈喽&#xff0c;师傅们&#xff01; 这次给师傅们分享的是上上个星期的地级市护网的攻防演练的两个案例&#xff0c;涉及到的知识点可能比较偏&#xff0c;下面我也会提前给师傅们拓展下改漏洞相关的知识点内容。护网攻防演练中&#xff0c;涉及到的很多敏感内容这…

【Linux】驱动的基本架构和编译

驱动源码 /** Silicon Integrated Co., Ltd haptic sih688x haptic driver file** Copyright (c) 2021 kugua <daokuan.zhusi-in.com>** This program is free software; you can redistribute it and/or modify it* under the terms of the GNU General Public Licen…

css实现自定义静态进度条-vue2

实现如图所示 html&#xff1a; <div class"progress-container"><div class"progress-box left" :style"leftStyle"><div class"progress-value-top left">总中标电量</div><div class"progress-val…

前端请求音频返回pcm流进行播放

业务场景是chat回答&#xff0c;点击播放则会将回答内容进行请求&#xff0c;返回音频数据流进行播放 实现方案&#xff0c;因为后端返回的是流式接口&#xff0c;但是流式接口我去截取后用自己完成的流式播放器方法进行播放会存在杂音&#xff0c;但是短句接口返回速度尚可&a…

composer环境变量(phpstudy集成环境)无法使用问题

composer 不是内部或外部命令,也不是可运行的程序 或批处理文件。 按下WinR组合键打开“运行”&#xff0c;输入sysdm.cpl 回车&#xff0c;打开“系统属性”并切换至“高级”选项卡&#xff0c;点击“环境变量”进行配置 配置完后点击确定&#xff0c;重新打开命令行&#x…

Bootstrap框架-container类,container-fluid类,栅格系统

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

康养为松,智能为鹤:华为全屋智能画出的松鹤长春图

在道家文化中&#xff0c;喜欢将松与鹤并举&#xff0c;以其长寿与仙逸表达对老年人的美好祝愿。松鹤延年、松龄鹤寿等成语皆出于此。松鹤长春图&#xff0c;也成为国画当中的经久不衰的题材。 当我们迎来老龄化时代&#xff0c;“松鹤长春”则成为了整个社会的共同期待。 根据…

【初阶数据结构】排序——插入排序

目录 前言直接插入排序希尔排序 前言 排序&#xff1a;所谓排序就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。排序算法&#xff0c;就是如何使得记录按照要求排列的方法。   例如&#xff1a;买东西时会根据销量或价…

java并发编程笔记 之 线程和进程

文章目录 前言线程线程优先级和时间片创建多线程及运行线程的状态 进程查看进程的命令进程的通信方式 线程和进程的区别从关系上疑问集锦 前言 并发 1、并发是指在同一时间段内&#xff0c;计算机系统能够处理多个任务的能力。 2、在并发编程中&#xff0c;我们可以理解为多个…

代码随想录算法训练营第三十九天 | 198.打家劫舍 ,213.打家劫舍II,337.打家劫舍III

第三十九天打卡&#xff0c;今天解决打家劫舍系列问题&#xff0c;树形dp比较难。 198.打家劫舍 题目链接 解题过程 dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。 要么不偷这一间&#xff0c;那就是前面那间…

毕业设计选题:基于ssm+vue+uniapp的校园失物招领小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

大瓜-CSP-J/S2024第一轮认证题目涉嫌泄露。竞赛公平能否维护?

2024年全国信息学奥赛&#xff08;CSP-J/S&#xff09;泄题事件在竞赛界掀起了巨大的波澜。这场赛事本应是全国最具公信力的编程竞赛之一&#xff0c;但部分题目在考试前已被某些培训机构押中&#xff0c;这一泄题行为不仅让考生与家长感到愤怒&#xff0c;也让公众对奥赛的公平…

scp 命令:在两台主机间远程传输文件

一、命令简介 ​scp​ 命令使用 SSH ​加密的方式在本地主机和远程主机之间复制文件。 ‍ 二、命令参数 格式 scp [选项] 发送方主机和目录 接收方主机和目录注意&#xff1a;左边是发送方&#xff0c;右边是接收方。固定格式。 示例 #示例1 scp ~/test.txt soulio172.1…

豆包MarsCode体验

这个AI助手贴合做题者的思路&#xff0c;可以实时对代码进行分析&#xff0c;提出纠错、优化、规范性意见&#xff0c;非常好用。

基于数据挖掘的航空客户满意度分析预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 航空公司致力于提供多样化的服务以满足乘客需求&#xff0c;包括但不限于提供免费无线网络、免费食物饮品、提供网上预约服务、飞机出口位置、座椅舒适度、卫生状况等&#xff0c;并希望以此提升乘…

构造者模式多种实现方式

构造者模式 ​ 构造者模式建议将对象构造代码从产品类中抽取出来&#xff0c; 并将其放在一个名为构造者的独立对象中 ​ 构建者模式也是用来创建对象&#xff0c;但是相对于工厂模式来说&#xff0c;建造者模式适用于构建复杂对象&#xff0c;而工厂模式适用于创建对象的封装…

asp.net core日志与异常处理小结

asp.net core的webApplicationBuilder中自带了一个日志组件,无需手动注册服务就能直接在控制器中构造注入&#xff0c;本文主要介绍了net core日志与异常处理小结&#xff0c;需要的朋友可以参考下 ILogger简单使用 asp.net core的webApplicationBuilder中自带了一个日志组件…

网络安全-长亭雷池waf的sql绕过,安全狗绕过(5种绕过3+2)

目录 一、环境 二、讲解 三、绕过前思路整理 3.1 思路 3.1.1 入门思路 0x00截断filename 3.1.2 双写上传描述行(差异绕过&#xff09;【成功】 3.1.3双写整个 part 开头部分 3.1.4 构造假的 part 部分 1【成功】 3.1.5 构造假的 part 部分2【成功】 3.1.6 两个 bounda…