在我们平常查看的源码中能够经常的看到使用位运算符,这些位运算符一般只用于整数类型和字符类型的运算,Java 提供的常用位运算符有:

操作符

描述

&

按位与

\

按位或

~

按位非

^

按位异或

>>

右移运算符

<<

左移运算符

>>>

无符号右移运算符

& 按位与

//&(与)运算符的计算规则是 1&1=1 1&0,0&1,0&0 =0 ,只有两位操作数都为1的时候,这两位操作数&(与)运算的结果才为1,否则为0

//(包括符号位)

int bit1 = 0b011;

int bit2 = 0b110;

System.out.println(bit1&bit2);

//输出结果为2

0b010

&

0b110

------

0b010 = 2

| 按位或 仍然以 bit1和 bit2两个操作数为例

//| (或)运算符的计算规则是 1|1, 1|0,0|1 = 1 ,0&0 =0 ,只要有一位操作数是1,那么这两个操作数|(或)运算的结果就为1,否则为0

//符号位也参与运算

System.out.println(bit1|bit2);

//输出结果为6

0b010

|

0b110

------

0b110

**~ 按位非 **~(非)是一个单目运算符,既是对一个操作数进行运算操作

// ~(非)运算规则是 将操作数的每一位都取反(包括符号位)

//(包括符号位)

int bit3 = 0b101;

System.out.println(~bit3);//输出结果为-6

根据~(非)运算规则,非运算是将操作数每一位都取反。

那么 bit3 = 00000000 00000000 00000000 00000101

对 bit3进行取反 ~bit3 = 11111111 11111111 11111111 11111010

很显然根据目前的结果 ~bit3与我们输出的结果-6是不匹配的。

造成上面的结果的原因是:

在计算机中对数值类型的是以二进制补码的形式进行存储和计算的.

这样我们就可以理解了,此时的bit3是以补码的形式在计算机中存储的,因此输出结果还需要将bit3转换成原码输出出来。

正数的原码 = 反码 = 补码

负数的补码 = 原码取反 + 1

负数的原码 =(补码-1)取反

~bit3的符号位为1,代表是一个负数,我们只需要对 bit3(补码)减1再进行取反(不包括符号位)就能得到bit3的原码,也就是输出结果。

~bit3 11111111 11111111 11111111 11111010

-1

-------------------------------------------

反码 = 11111111 11111111 11111111 11111001

原码 = 反码取反 = 10000000 00000000 00000000 00000110 = -6

**^按位异或 **

//^(按位异或)相同为0,不同为1 ,包括符号位置

int bit 4 = 5 ;

int bit5 = 5;

System.out.println(bit4^bit5); //输出结果为0

//正如前面计算机内都是以二进制补码存储和计算数值的

bit4 101

bit5 101

---------

000 //根据^(异或)相同得0,不同的1,计算结果与输出结果相同

>> (右移运算符)

//a>>b将操作数a向右移动b位 ,空出来的位置使符号位进行填充,正数使用0补位,负数1补位(在 java 中0b 开头代表二进制数据)

//(包括符号位)

我们以 4>>2 ,4>>3,-4>>2 ,-4>>3为例子进行讲解,我们假设操作数类型是 byte 类型,byte 类型默认是8位

//移位后空位常使用符号位进行填充

4(原)= 4(补)= 4(反) = 0b00000100(补)

-4(原)= 0b10000100 -4(反)= 0b11111011 -4(补)=0b11111100

4 >> 2 0b00000100(4的二进制补码)>> 2 = 0b00000001 = 1

4 >> 3 0b00000100 >> 3 = 0b00000000 = 0

-4 >>2 0b11111100(补) >> 2 = 0b11111111 转换成原码等于0b10000001 = -1

-4 >>3 0b11111100(补) >> 3 = 0b11111111 转换成原码等于0b10000001 = -1

<< (左移运算符)

//a<

//(包括符号位)

0b11000000_00000000_00000000_00000000 << 1 向做移动1位结果是0b10000000_00000000_00000000_00000000

>>>(无符号右移)

>>>右移,移动出来的位置全部以0进行补充(包括符号位)

4>>>2 -> 00000100(补) >>> 2 右移高位补0 结果为 00000001

-4 >>> 2 ->0b11111100(补码) >>> 右移高位补0 结果为 00111111

ps:在对操作数进行位移运算时候,系统会对位移大小进行优化。例如:

对一个32位的 int 类型移动34位,如果位移数大于当前类型表示的最大位数,那么系统会34%32 = 2, 位移数是求余的结果,即 4 >> 2 和4 >> 34结果是一样的

在上面的例子我们为了简单,使用了 byte 类型作为操作数,实际中二进制运算 byte 或者 short 都是会转换到 int类型或者更高的类型进行运算的,我们只是为了方便表达,将其假设会按照byte 类型进行运算

例1: byte a = 5;

5并不是默认就是 byte类型,默认是整形,只是系统会帮我们默认转化为 byte 类型

例2:byte h = 0b11111111 ;

如果0b11111111默认是 byte 类型,那么 h = -1,但实际并非如此,0b11111111默认的是 int 类型,它会按照 int 类型进行计算后在赋值给 h 变量,由于0b11111111的范围大于 byte 类型的表示范围,所以编辑器会提示我们进行强制转换,在运行中这回发生位溢出.

补充:

符号位是参与数值运算的.

java 位或运算符_Java 运算符(位运算符)相关推荐

  1. java中位与运算符_Java中位运算符和的区别

    一.<< 表示左移两位 < 注:以下数据类型默认为byte-8位 左移时不管正负,低位补0 正数:r = 20 << 2 正数:r = 20 << 2 20的 ...

  2. java boolean 按位或_布尔运算符与按位运算符

    布尔运算符与按位运算符 我对何时应该使用布尔运算符与按位运算符感到困惑 and vs &, or vs | 有人能启发我何时使用每种药物,何时使用一种药物会影响我的结果? 8个解决方案 56 ...

  3. python 按位运算符_Python按位运算符

    python 按位运算符 Python bitwise operators are used to perform bitwise calculations on integers. The inte ...

  4. 单片机C语言中的位运算符,单片机c语言教程第八课 运算符和表达式(位运算符)...

    学过汇编的朋友都知道汇编对位的处理能力是很强的,但是单片机C语言也能对运算对象进行按位操作,从而使单片机C语言也能具有一定的对硬件直接进行操作的能力.位运算符的作用是按位对变量进行运算,但是并不改变参 ...

  5. c语言位非运算符,C语言-位运算符

    C语言--位运算符 一.位运算符 1.按位与:& 1> 功能 * 只有对应的两个二进制位为1时,结果位才为1,否则为0 * 举例:10用二进制表示为1010,  7用二进制表示为0111 ...

  6. 按字节提取整形数值(按位与运算符“”、右移位运算符“”)

    输入一个十进制整数,将其转换成十六进制数输出,并提取每一字节所表示的十六进制数值逐一输出.测试数据如下: 分析:从控制台输入一个十进制整数,将其转换成十六进制数输出,接着提取其4个字节.用到按位与运算 ...

  7. java 异或 排序_Java的位运算符详解实例——与()、非(~)、或(|)、异或(^)...

    位运算符主要针对二进制,它包括了:"与"."非"."或"."异或".从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两 ...

  8. java中的运算符_java中的运算符

    一:概述: Java的运算符,分为四类: 算数运算符.关系运算符.逻辑运算符.位运算符. 算数运算符(9):+  -  *  /  %  ++  -- 关系运算符(6):==  !=  >  & ...

  9. 学了这么久Java都没搞懂位运算符

    大家好,我是贺贺,今天跟大家聊聊Java中的位运算符,说起来位运算符不知道你想起了什么,我是想起了二进制. 常用的运算符 在Java语言中,官方给我们提供了极为丰富的运算操作,但是常用的,好像也就是算 ...

  10. java中运算符_JAVA中的运算符

    Java语言支持如下运算符: 算术运算符: 算数运算符包括: + 加法运算,字符串连接运算 - 减法运算 * 乘法运算 / 除法运算 % 取模运算,两个数字相除取余数 ++ -- 自增自减运算 赋值运 ...

最新文章

  1. 上传图片时出现Request 对象 错误 'ASP 0104 80004005'
  2. 还记得那个提速8倍的IDEA插件吗?VS Code版本也发布啦!
  3. mysql 8.0.12解压版安装教程_mysql 8.0.12 解压版安装教程
  4. 使用系统调用pipe建立一条管道线_使用Unixbench对服务器综合性能打分及测试结果...
  5. rust和gta5哪个吃配置_晨报:Steam周销量榜 曝次世代GTA5用大镖客2引擎
  6. java-JDBC配置驱动程序
  7. NSIS 设置系统变量
  8. Java包范围可见性
  9. SQL SERVER 获得当前系统时间
  10. 二叉树各种遍历算法 Java 实现总结
  11. 使用Scratch3和ROS进行机器人图形化编程学习
  12. 监控服务器系统密码忘了,监控服务器登录密码忘记了怎么办
  13. 10min说完淘宝最初10年的产品故事
  14. Java初学者日志_05
  15. win10便签常驻桌面_win10技巧分享第六篇——win10自带的备忘录便签功能
  16. mysql弱口令加强,Mysql弱口令取得系统权限(续)
  17. RS485——RS485通信基础理论与STM32测试
  18. 数据治理系列8:数据价值管理
  19. MYSQL复制表结构及数据到新表
  20. mysql 查询 锁表_怎么查找mysql中的锁表语句?

热门文章

  1. 运维 --- Nginx介绍和在CentOS/Redhat下安装
  2. VR全景看房的具体优势有哪些
  3. Suhana and Equation | codechef 几何级数的模和
  4. python遍历字典键值做变量名 字符串做变量名
  5. mongodb数据库使用01、基础查询和数据类型介绍
  6. 按钮的禁用disabled属性
  7. DICOM笔记-DICOM常用Tag标签汇总
  8. 机器学习题5:请简述ID3算法的实现步骤,并利用ID3算法构建天气数据集的决策树模型,实现决策树的可视化。
  9. Hadoop学习(11)-MapReduce的核心运行机制
  10. 关于Java8中那些经常用到的日期处理