Java位运算符:Java移位运算符、复合位赋值运算符及位逻辑运算符

news2024/9/24 23:32:14

Java 定义的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括 long,int,short,char 和 byte。

位运算符主要用来对操作数二进制的位进行运算。按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值。

Java 语言中的位运算符分为位逻辑运算符和位移运算符两类,下面详细介绍每类包含的运算符。

位逻辑运算符

位逻辑运算符包含 4 个:&(与)、|(或)、~(非)和 ^(异或)。除了 ~(即位取反)为单目运算符外,其余都为双目运算符。表 1 中列出了它们的基本用法。

表 1 位逻辑运算符

运算符

含义

实例

结果

&

按位进行与运算(AND)

4 & 5

4

|

按位进行或运算(OR)

4 | 5

5

^

按位进行异或运算(XOR)

4 ^ 5

1

~

按位进行取反运算(NOT)

~ 4

-5

位与运算符

位与运算符为&,其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为 1,那么计算结果才为 1,否则为 0。因此,任何数与 0 进行按位与运算,其结果都为 0。

例如下面的表达式:

100&0

图 1 所示为这个运算过程,结果为 0。

图 1 100位与0的运算过程

下面是两个非零的数字进行位与运算的过程。

这两行语句执行后变量 Z 的值是 4,图 2 所示为这个运算过程。

图 2 5位与12的运算过程

位或运算符

位或运算符为|,其运算规则是:参与运算的数字,低位对齐,高位不足的补零。如果对应的二进制位只要有一个为 1,那么结果就为 1;如果对应的二进制位都为 0,结果才为 0。

下面是一个使用位或运算符的表达式。

11|7

运算结果为 15,图 3 所示为其运算过程。

图 3 11位或7的运算过程

位异或运算符

位异或运算符为^,其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的二进制位不相同,结果则为 1。

下面是一个使用位异或运算符的表达式。

11^7

运算结果为 12,图 4 所示为其运算过程。

图 4 11位异或7的运算过程

提示:在有的高级语言中,将运算符^作为求幂运算符,要注意区分。

位取反运算符

位取反运算符为~,其运算规则是:只对一个操作数进行运算,将操作数二进制中的 1 改为 0,0 改为 1。

下面是一个使用位取反运算符的表达式。

~10

运算结果为 65525,图 5 所示为其运算过程。

图 5 对10位取反的运算过程

我们可以使用如下的程序来检查这个运算结果。

编译执行以上程序,会发现输出的结果是 -11,而不是 65525。这是因为取反之后的结果是十六进制数,而在上面的程序中使用 %d 将输出转换为了十进制数。

可以使用如下语句查看十六进制结果。

可以看到输出结果为 fff5,将它转换为二进制是 1111111111110101。这个二进制数的最高位为 1,表示这个数为负数。除最高位外,按位取反再加 1,即得到二进制原码 1000000000001011,用十进制数表示即为 -11。

注意:位运算符的操作数只能是整型或者字符型数据以及它们的变体,不用于 float、double 或者 long 等复杂的数据类型。

位移运算符

位移运算符用来将操作数向某个方向(向左或者右)移动指定的二进制位数。表 2 列出了 Java 语言中的两个位移运算符,它们都属于双目运算符。

表 2 位移运算符

运算符

含义

实例

结果

»

右移位运算符

8»1

4

«

左移位运算符

9«2

36

左位移运算符

左移位运算符为«,其运算规则是:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

例如,将整数 11 向左位移 1 位的过程如图 6 所示。

图 6 对11左移1位运算过程

从图 6 中可以看到,原来数的所有二进制位都向左移动 1 位。原来位于左边的最高位 0 被移出舍弃,再向尾部追加 0 补位。最终到的结果是 22,相当于原来数的 2 倍。

右位移运算符

右位移运算符为»,其运算规则是:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补零。

例如,将整数 11 向右位移 1 位的过程如图 7 所示。

图 7 对11右移1位运算过程

从图 7 中可以看到,原来数的所有二进制位都向右移动 1 位。原来位于右边的最低位 1 被移出舍弃,再向最高位追加 0 补位。最终到的结果是 5,相当于原数整除 2 的结果。

复合位赋值运算符

所有的二进制位运算符都有一种将赋值与位运算组合在一起的简写形式。复合位赋值运算符由赋值运算符与位逻辑运算符和位移运算符组合而成。表 3 列出了组合后的复合位赋值运算符。

表3 复合位赋值运算符

运算符

含义

实例

结果

&=

按位与赋值

num1 &= num2

等价于 num 1=num 1 & num2

|=

按位或赋值

num1 |= num2

等价于 num 1=num 1 | num2

^=

按位异或赋值

num1 ^= num2

等价于 num 1=num 1 ^ num2

-=

按位取反赋值

num1 -= num2

等价于 num 1=num 1 - num2

«=

按位左移赋值

num1 «= num2

等价于 num 1=num 1 « num2

»=

按位右移赋值

num1 »= num2

等价于 num 1=num 1 » num2

下面的程序定义了几个 int 型变量,然后运用位赋值简写的形式将运算后的值赋给相应的变量:

该程序的输出为:

a = 1

b = 1

c = 6

https://www.bilibili.com/video/BV1yW4y1T7Yb/?spm_id_from=333.999.0.0&vd_source=96bd6c0a2bc667ee6713079257ccf5ad

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

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

相关文章

GitLab安装使用(SSH+Docker两种方式)

GitLab安装使用1、在ssh下安装gitlab1.1 安装依赖1.2 配置镜像1.3 开始安装1.4 gitlab常用命令2、在docker下安装gitlab2.1 安装docker2.1.1 更新yum源2.1.2 安装依赖2.1.3 添加镜像2.1.4 查看源中可用版本2.1.5 安装指定版本2.1.6 配置开机启动项2.2 使用容器安装gitlab2.2.1 …

车载以太网 - DoIP头部信息检测逻辑 - 03

通过前面的文章我们已经了解了DoIP所具备的Payload类型,基础的信息都已经具备了,今天我们就要进一步的去了解DoIP的处理逻辑了;按照正常的逻辑来看,处理无论是我们人眼去看书,还是计算机处理一段数据,都是从前到后依次进行处理;而DoIP的信息处理也不例外,也是从头开始进…

2023跨境出海指南:印度网红营销白皮书

前不久,联合国预测印度人口将在4个月后超过中国,成为全球第一人口大国。印度这个国家虽然有些奇葩,但他们的经济实力确实不能小觑,这也是众多国际公司大力发展印度的原因。出海印度容易,但攻克印度市场太难&#xff0c…

Python Tutorial——类

与其它编程语言相比,Python的类机制添加了最小的新语法和语义。它是C和Modula-3中的类机制的混合。Python的类提供了面向对象编程的所有的标准特性,类继承机制允许有多个基类,一个子类可以重写基类中的任何方法,一个方法可以调用基…

编程思想图书推荐,新手入门应该看些啥

编程思想图书推荐,新手入门应该看些啥 导入 元旦的时候,学校社团的指导老师,咨询我有没有什么可以推荐的编程思想的学习书籍,可以值得推荐精读。 说实话,我个人是买过很多书的,但是很少读书,如果…

搭建redis主从复制+哨兵高可用

从服务器连接主服务器,发送SYNC命令;主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续…

Window下安装oracle12C

1.Window下安装oracle12C 官网下载地址: Database Software Downloads | Oracle 页面顶部选择 “接受许可协议” 后,我想选择下载 12c 版的企业版,文件1和文件2都需要下载。(如果提示登录 Oracle,则需要先登录才能下…

java家装网装修网站装修系统源码

简介 本平台主要是家装网站。管理员发布装修案例,看工地,装修设计师,装修攻略,装修知识文章等,嵌入3d全景图。普通用户注册,填写装修房型报价等。 演示视频: https://www.bilibili.com/video/…

Kotlin基础入门 - 静态变量、常量 And 静态函数、方法

2022一晃而过,2023悄然而至,有天晚上看第一行代码(第三版)的时候,又看到了Kotlin中静态方法的几种使用方式,蹭着过年还有一些时间,写了个Demo简单测试记录一下 在 Kotlin 中使用静态的方式不止一…

JavaScript基础系列之原型链

1. 前言 今天的重点复习的是JavaScript原型链。所谓是"基础不牢,地动山摇",原型链作为继承等相关知识的基础,就显得尤为重要了。接下来以手绘原型链为基础,详解讲解下原型链以及相关的属性 2. 原型 以及原型链 2.1 pro…

vs 生成前事件 生成后事件命令

为了提高编译生成后的事件效率,不需要手动的拷贝到固定目录。可以在项目->属性中设备生成后事件。输入相应的命令行,即可。 Visual Studio中,可以在项目-》属性-》生成事件-》生成后事件命令行 xcopy 复制文件; /y/e 如果只复…

JavaEE【Spring】:MyBatis查询数据库

文章目录一、理论储备1、MyBatis 的概念2、MyBatis 的作用二、第⼀个MyBatis查询1、创建数据库和表2、添加MyBatis框架支持① 老项目添加MyBatisⅠ. 新增功能Ⅱ. EditStarters插件② 新项目添加MyBatis3、配置连接字符串和MyBatis① 配置连接字符串② 配置 MyBatis 中的 XML 路…

数据标注平台如何保护用户数据安全?

近期,在《麻省理工科技评论》在一篇万字长文调查中,一位年轻女子坐在自家的马桶上的图片也被扫地机器人拍摄下来,并被流传到网上、大范围传播。但事实上,这也并非是一件新鲜事了。例如,2020年秋,一系列从低…

为什么MySQL 要选择 B+树

一、什么是索引 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。再直白点就是我们可以把索引理解成图书或者字典的目录。 既然索引是数据的一种存储结构,那么我们必然要对其进行存储,同时&…

你可以不用Git,但不能不会Git(二)基础(上)

目录 一.环境配置 二.本地初始化仓库 三.文件的两种状态 四.文件加入暂存区 五.文件提交与删除 1.提交文件 2.删除文件 一.环境配置 当安装Git后首先要做的事情是设置用户名称和email地址。这是非 常重要的,因为每次Git提交都会使用该用户信息。 设置用户信…

#G. 红旗招展

Description小J占山为王有一段时间了,他决定把自己的地盘打扮一下---将各种颜色的旗插在山头上当然某一座的山头只能用一种颜色的旗。整个地盘有N个山头,可看成是一棵有N个节点的树。小J还是有一点艺术细胞的,他不想整个地盘杂乱无章。于是他…

Kubernetes安装ingress-controller

IngressController 1. 安装 1.1 查看ingress-nginx的版本匹配 https://github.com/kubernetes/ingress-nginx/blob/main/README.md#readme 下载配置 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/cloud/de…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的图像实例分割模型

给我推荐20个比较流行的图像实例分割模型 U-Net Mask R-CNN FCN SegNet PSPNet DeepLabv3 DenseASPP LinkNet RefineNet ENet ICNet BiSeNet CRF-RNN GCN Tiramisu FRRN DeepLabv3 PANet MaskLab Hybrid Task Cascade给我推荐20个比较流行的图像实例分割模型源码 好的&#x…

java学习之类变量

目录 一、类变量的引出 需解决的问题 传统代码 代码问题 解决方法 运行结果 二、类变量的内存布局 特点 内存中的位置 三、类变量定义 四、类变量语法 五、访问类变量 六、类变量细节 第一条 第二条 第三条 第四条 第五条 第六条 第七条 一、类变量的引出 需…

PHP8---MySQL扩展

目录 一、MySQL扩展的介绍 二、PHP和MySQL连接的基本操作 (1)MySQL连接的准备工作 (2)插入删除操作 三、查询操作 (1)mysqli_fetch_assoc (2)mysqli_fetch_row (3…