Java 中的位运算与移位运算详解

目录
  • 位运算
    • 按位“与” &
    • 按位“或” |
    • 异或 ^
  • 移位运算
    • 左移 <<
    • 右移 >>
    • 无符号右移 >>>
  • 总结

位运算

按位“与” &


规则: 如果两个相应的二进制形式的对应的位数都为 1,则结果为 1;否则为 0;


4 & 5


4


0000 0100


5


0000 0101


按位与运算


&


4 & 5 = 4


0000 0100


1 * 2^2 = 4


-4 & 5


-4


1111 1100


5


0000 0101


按位与运算


&


规则:运算结果符号位是1,为负数, 需要减 1,再取反(其他运算也要遵循)


-4 & 5 = 4


0000 0100


1 * 2^2 = -4

1.正数直接取二进制运算

2.负数取反加一得补码再运算,得到的结果符号位为 0,不需要做任何操作直接给出结果

按位“或” |


规则: 有 1 为 1;否则为 0;


4 | 5


4


0000 0100


5


0000 0101


按位或运算


|


4 | 5 = 5


0000 0101


1 * 2^0 + 1 * 2^2 = 5


-4 | 5


-4


1111 1100


5


0000 0101


按位或运算


|


规则:运算结果符号位是1,为负数, 需要减 1,再取反(其他运算也要遵循)


-4 | 5 =


1111 1101


减1


1111 1100


取反


-0000 0011


-4 | 5 = -3


1 * 2^0 + 1 * 2^1 = -3

异或 ^


规则: 相同为 0;不同为 1;


4 ^ 5


4


0000 0100


5


0000 0101


按位异或运算


^


4 ^ 5 = 1


0000 0001


1 * 2^0 = 1


-4 ^ 5


-4


1111 1100


5


0000 0101


按位异或运算


^


规则:运算结果符号位是1,为负数, 需要减 1,再取反(其他运算也要遵循)


-4 ^ 5 =


1111 1001


减1


1111 1000


取反


-0000 0111


-4 ^ 5 = -7


1 * 2^0 + 1 * 2^1 + 1 * 2^2 = -7

移位运算

左移 <<


规则: 右边空出的位用 0 填补高位,左移溢出则舍弃该高位。


8 << 2


8


0000 1000


<< 2


0010 0000


左移运算符


<<


结果


8 << 2 = 32


1 * 2^5 = 32


-8 << 2


-8


1111 1000


<< 2


1110 0000


左移运算


<<


规则:运算结果符号位是1,为负数, 需要减 1,再取反(其他运算也要遵循)


减1


1101 1111


取反


-0010 0000


-8 << 2 = -32


1 * 2^5 = -32

右移 >>


规则: 左边空出的位正数用 0 负数 1 填补,右移溢出则舍弃该低位。


8 >> 2


8


0000 1000


>> 2


0000 0010


左移运算符


>>


结果


8 >> 2 = 2


1 * 2^1 = 2


-8 >> 2


-8


1111 1000


>> 2


1111 1110


左移运算


>>


规则:运算结果符号位是1,为负数, 需要减 1,再取反(其他运算也要遵循)


减1


1111 1101


取反


-0000 0010


-8 >> 2 = -2


1 * 2^1 = -2

无符号右移 >>>


规则: 正数与右移规则一样;负数无符号右移,在高位补 0


8 >>> 2


8


0000 1000


>> 2


0000 0010


无符号右移运算符


>>>


结果


8 >>> 2 = 2


1 * 2^1 = 2


-8 >>> 2


-8


1111 1111 1111 1111 1111 1111 1111 1000


>>> 2


0011 1111 1111 1111 1111 1111 1111 1110


无符号右移运算符


>>>


规则:运算结果符号位是1,为负数, 需要减 1,再取反(其他运算也要遵循)


减1


-


取反


-


-8 >>> 2 = 1073741822


1073741822

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java中的位运算符、移位运算详细介绍

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&) :两位全为1,结果为1,否则为0: (2)按位或 (|) :两位有一个为1,结果为1,否则为0: (3)按位取反(~):0 变 1, 1变0: (4)按位异或(^):两位,如果相同,结果为0:如果不同,结果为1: 注意: (1)位运算中的 符号位(最高位)也跟着变; (2)位运算符与逻辑运算符(逻辑与&&.逻辑或||.逻辑非! )有点相似.但是,逻辑运算符只能操作boolean变量 (也就是左右两边的值

  • java中关于移位运算符的demo与总结(推荐)

    首先,移位运算符有三种,其操作类型只支持:byte / short / char / int和long五种. << 左移运算符,表示将左边的操作数的二进制数据向左移动*位,移动后空缺位以0填充,多余位舍弃.(等同于乘2的n次方) >> 右移运算符,二进制数据向右移动*位,就在其二进制数据后抹掉几位?(这里还不错定,但个人理解是这样的)(等同于除2的n次方) >>> 无符号右移运算符,不管移动前最高位是0还是1,右移后左侧产生的空位部分都以0来填充. 下面我们借一个

  • Java利用移位运算将int型分解成四个byte型的方法

    package 移位运算; public class 移位运算 { public static void main(String[] args) { //00000111 01011011 11001101 00010101 int n=123456789; //n为需要进行移位处理的32位int型初始值 byte[] a =chai(n); for (int i = 0; i < a.length; i++) { byte b=a[i]; System.out.print(b+" &qu

  • Java移位运算符详解实例(小结)

    移位运算符它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>),移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数. 运算符 含义 << 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) >> "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数.使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补

  • java中的移位运算符心得总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >> 1,相当于num除以2 >>>    :     无符号右移,忽略符号位,空位都以0补齐 下面来看看这些移位运算都是怎样使用的 复制代码 代码如下: /** *  */package com.b510.test; /** * @author Jone Hongten * @creat

  • Java三种移位运算符原理解析

    这篇文章主要介绍了Java三种移位运算符原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位(符

  • Java中BigDecimal类的add()的使用详解

    Java中的BigDecimal类的使用: 使用Java中的BigDecimal可以进行精确的计算,但是在使用BigDecimal时我们需要注意它的add()方法,使用它自身的add( )方法并不会改变它原始的值,因为初始化BigDecimal是创建一个了个对象,使用add()方法时也等于是创建了一个对象,若要保存这个对象需要再创建一个对象. 句法: public BigDecimal add(BigDecimal val); public BigDecimal add(BigDecimal v

  • Java中对List集合的常用操作详解

    目录: 1.list中添加,获取,删除元素: 2.list中是否包含某个元素: 3.list中根据索引将元素数值改变(替换): 4.list中查看(判断)元素的索引: 5.根据元素索引位置进行的判断: 6.利用list中索引位置重新生成一个新的list(截取集合): 7.对比两个list中的所有元素: 8.判断list是否为空: 9.返回Iterator集合对象: 10.将集合转换为字符串: 11.将集合转换为数组: 12.集合类型转换: 备注:内容中代码具有关联性. 1.list中添加,获取,

  • java 中 String format 和Math类实例详解

    java 中 String format 和Math类实例详解 java字符串格式化输出 @Test public void test() { // TODO Auto-generated method stub //可用printf(); System.out.println(String.format("I am %s", "jj")); //%s字符串 System.out.println(String.format("首字母是 %c",

  • java 中Excel转shape file的实例详解

    java  中Excel转shape file的实例详解 概述: 本文讲述如何结合geotools和POI实现Excel到shp的转换,再结合前文shp到geojson数据的转换,即可实现用户上传excel数据并在web端的展示功能. 截图: 原始Excel文件 运行耗时 运行结果 代码: package com.lzugis.geotools; import com.lzugis.CommonMethod; import com.vividsolutions.jts.geom.Coordina

  • 基于java中的PO VO DAO BO POJO(详解)

    一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的ava对象. 最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合PO中应该不包含任何对数据库的操作. 二.VO:value object值对象.通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已.但应是抽象出的业务对象可以和表对应也可以不这根据业务的需要 三.DAO:data access object 数据访问对象,此对象用于访问数据库.通常和PO结合使用,DAO中包含了各种

  • JAVA 中解密RSA算法JS加密实例详解

    JAVA 中解密RSA算法JS加密实例详解 有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决 . java代码 需要依赖 commons-codec 包 RSACoder.Java import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.

  • Java 中组合模型之对象结构模式的详解

    Java 中组合模型之对象结构模式的详解 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 你想表示对象的部分-整体层次结构 你希望用户忽略组合对象与单个对象的不同,用户将统一使用组合结构中的所有对象. 三.结构 四.代码 public abstract class Component { protected String name; //节点名 public Component(String n

  • Java中成员方法与成员变量访问权限详解

    记得在一次面试的笔试题中,有的面试官会要求写出具体的像pullic这些访问限定符的作用域.其实,平常我都没去系统的考虑这些访问限定符的作用域,特别是包内包外的情况,OK,笔试不行了. 这是java基本的知识,也是公司看重的,那没办法啦,我的脑袋记不住东西,那我只能把这些东西写下来方便自己温故知新,不废话了,贴代码了. 代码如下: package com.jaovo; /** *_1_ 成员变量访问权限的求证 * public private protected default(默认的权限) *自

  • Java中map遍历方式的选择问题详解

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率.那么实际情况如何呢? 为了解遍历性能的真实差距,包括在遍历key+value.遍历key.遍历value等不同场景下的差异,我试着进行了一些对比测试. 2. 对比测试 一开始只进行了简单的测试,但结果却表明k

随机推荐