在我们平常查看的源码中能够经常的看到使用位运算符,这些位运算符一般只用于整数类型和字符类型的运算,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. Java编程经典10道_Java经典编程题50道之十二
  2. Asp.net中Js、Css文件压缩辅助类
  3. 漫步数学分析二十九——幂级数
  4. NYOJ260 - 数数小木块
  5. 分层架构(第一张章)
  6. IDEA 下载、安装、配置和案例
  7. Oracle 、SqlServer 根据日期逐日、逐月递增累加、逐行累加
  8. python编写poc_POC编写基础知识
  9. TEEOS的实例-在线支付系统
  10. java数字转为大写_java 数字转大写汉字
  11. uni轮播图添加页数
  12. 射频流盘与射频孪生——流盘技术应用(1)
  13. ACE网络编程开发网
  14. type和interface的区别
  15. HTK搭建大词汇量连续语音识别系统(一)
  16. 主动近红外与深度图融合的SLAM方法调研
  17. 同花顺趋势抄底逃顶线指标公式源码 逢低关注逢高派发
  18. Win10 定制美化神器
  19. Android 系统的分区
  20. 教育培训app开发过程中有哪些难点?应如何解决?

热门文章

  1. Pandas删除某一列的方法
  2. 3D建模可视化公司VR线上全景展厅
  3. 2017年考研英语二真题中文章来源及规律分析
  4. C#--实例选号器生成随机数
  5. DCL(双锁检测)单例模式
  6. 初次申请林业调查规划设计资质办理具备条件
  7. 钉钉微应用 - - - - 如何本地开发调试
  8. ubuntu挂载usb光驱_Linux 文件系统挂载mount命令讲解
  9. 用for循环模拟ATM取款
  10. python xlrd模块下载_xlrd模块怎么在python中使用