首页 > 编程语言 >3.9 Java位运算符:Java移位运算符、复合位赋值运算符及位逻辑运算符

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

时间:2023-09-15 13:12:34浏览次数:40  
标签:Java 运算 num2 运算符 及位 num 按位 赋值

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的运算过程
下面是两个非零的数字进行位与运算的过程。
  1. int x = 5,y = 12; // 创建整型变量保存两个数
  2. int z = x&y; // 对这两个数进行位与运算,结果保存到z

这两行语句执行后变量 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位取反的运算过程
我们可以使用如下的程序来检查这个运算结果。
  1. int i = 10;
  2. System.out.printf("%d \n",~i);

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

可以使用如下语句查看十六进制结果。
  1. int i=10;
  2. System.out.printf("%x \n",~i);

可以看到输出结果为 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 型变量,然后运用位赋值简写的形式将运算后的值赋给相应的变量:
  1. int a = 1;
  2. int b = 2;
  3. int c = 3;
  4. a &= 4;
  5. a |= 4;
  6. a ^= c;
  7. a -= 6;
  8. b >>= 1;
  9. c <<= 1;
  10. System.out.println("a = " + a);
  11. System.out.println("b = " + b);
  12. System.out.println("c = " + c);
该程序的输出为:

a = 1
b = 1
c = 6

标签:Java,运算,num2,运算符,及位,num,按位,赋值
From: https://www.cnblogs.com/szmtjs10/p/17704804.html

相关文章

  • 3.10 Java三目运算符(条件运算符? :)
    Java 提供了一个特别的三元运算符(也叫三目运算符)经常用于取代某个类型的if-then-else语句。条件运算符的符号表示为“?:”,使用该运算符时需要有三个操作数,因此称其为三目运算符。使用条件运算符的一般语法结构为:result=<expression>?<statement1>:<statement3>;其......
  • 3.12 Java直接量(字面量)
    直接量是指在程序中通过源代码直接给出的值,例如在inta=5;代码中,为变量a所分配的初始值5就是一个直接量。直接量的类型并不是所有的数据类型都可以指定直接量,能指定直接量的通常只有三种类型:基本类型、字符串类型和null类型。具体而言,Java 支持如下8种类型的直接量......
  • 3.11 Java运算符优先级
    所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数......
  • Java数据类型转换:强制类型转换+自动类型转换
    数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它需要从一种数据类型转换成另一种数据类型。数据类型的转换可以分为隐式转换(自动类型转换)和显式转换(强制类型转换)两种。隐式转换(自动类型转换)如果以下2个条件都满足,那么将一种类型的数据赋给另外一种......
  • 3.3 Java算术运算符
    运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的。Java语言中的运算符除了具有优先级之外,还有一个结合性的特点。当一个表达式中出现多种运算符时,执行的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的约束,以便确定是自左向右进......
  • 无涯教程-JavaScript - XOR函数
    描述XOR函数返回所有参数的逻辑异或。如果所提供条件的奇数判断为TRUE,则XOR函数返回TRUE,否则返回FALSE。语法XOR(logical1,[logical2],…)争论Argument描述Required/Optionallogical1logical1isrequiredandsubsequentlogicalvaluesareoptional.1to254c......
  • java 发行
    oracle17版本:JavaDownloads|OracleAdoptOpenJDK:https://adoptium.net/zh-CN/download/华为JDK:https://www.hikunpeng.com/developer/devkit/compiler/jdkAlibabaDragonwell,阿里巴巴版jdk......
  • 无涯教程-JavaScript - TRUE函数
    描述TRUE函数返回逻辑值TRUE。YoucanusethisfunctionwhenyouwanttoreturnthevalueTRUEbasedonacondition.Example=IF(A1=1,TRUE()).YoucanalsoenterthevalueTRUEdirectlyintocellsandformulaswithoutusingthisfunction.Example=IF(A1=1,T......
  • 基于java的在线考试系统的设计-计算机毕业设计源码+LW文档
    摘要随着信息技术的发展,管理系统越来越成熟,各种企事业单位使用各种类型的管理系统来提高工作效率,从而降低手工操作的弊端。我国政府一直以来都非常重视高校教育的发展,近几年来高校学生人数逐渐增加,对在线考试的需求越来越多。因此,通过开发基于java的在线考试系统来提高学习效率,增......
  • java分布式特点_java分布式架构是什么?分布式架构的优缺点有哪些?
    作为目前互联网最流行的技术之一,分布式是当仁不让的,小伙伴们都了解什么是分布式架构吗?它的优缺点又有哪些呢?快听小编为你介绍介绍吧。一、什么是分布式架构?分布式概念要想理解什么是分布式,我们一定要知道以下这些性质:1)、首先,一个分布式系统它一定是由多个节点组成的系......