Java位运算—高级用法与深入解读(下)

简介: Java位运算—高级用法与深入解读(下)

9.无符号右移(>>>)


m>>>n:整数m表示的二进制右移n位,不论正负数,高位都补0,实例如下:


5>>>2 :把十进制的数值5右移两位,按如下步骤计算,


把5转位16位的二进制机器数:00000000 00000000 00000000 00000101


按右移原理,将二进制数左移两位:00000000 00000000 00000000 00000001


右移后结果为1


-5>>>2:把十进制的数值-5右移两位,按如下步骤计算,


把-5转位16位的二进制机器数:11111111 11111111 11111111 11111011


按右移原理,将二进制数右移两位:00111111 11111111 11111111 11111110


右移后结果为正数


10.按位非操作(~)


~ 按位取反操作符,对每个二进制位的内容求反,即1变成0,0变成1实例如下


把-5转位16位的二进制机器数:11111111 11111111 11111111 11111011


~(-5) 取反结果:00000000 00000000 00000000 00000100


转为十进制,结果为4


11.按位与操作(&)


& 位与操作符,对应的二进制位进行与操作,两个都为1才为1,其他情况均为0,原理如下:


1&0=0


0&0=0


1&1=1


0&1=0


实例:-5 & 4


-5的二进制形式为: 11111111 11111111 11111111 11111011


4的二进制形式为: 00000000 00000000 00000000 00000100


——————————————————————————————


逻辑与运算结果: 00000000 00000000 00000000 00000000


最终结果为0。


12.按位或操作(|)


| 位或操作符,对应的二进制位进行或操作,两个都为0才为0,其他情况均为1,原理如下:


1|0=1


0|0=0


1|1=1


0|1=1


实例:-5 | 4


-5的二进制形式为:11111111 11111111 11111111 11111011


4的二进制形式为:00000000 00000000 00000000 00000100


————————————————————————————


逻辑或运算结果: 11111111 11111111 11111111 11111111


最终结果为-1。


利用或的原理我们可以把字节转换为整数,-64&0xFF=192,其中0xFF表示整数255。


13.按位异或操作( ^ )


^ 异或操作符,相同位值为0 否则为1,原理如下:


1^1=0


1^0=1


0^1=1


0^0=0


实例:-5 ^ 4


-5的二进制形式为:11111111 11111111 11111111 11111011


4的二进制形式为:00000000 00000000 00000000 00000100


————————————————————————————


逻辑异或运算结果: 11111111 11111111 11111111 11111111


最终结果为-1。


其实利用逻辑异或操作有个作用就是可以比较两个数值是否相等,即利用11=0,00=0的原理,如5^5==0。


14.总结


通过上面的分析,我们对java的位运算也算有了比较全面的了解,那么我们的程序通过位运算又有什么优势呢?其实通过位运算确实会比我们直接的程序代码运算会快很多,因为位运算直接运算的是计算机底层的二进制机器操作指令,而我们的程序代码运算最终也是要转成计算机可识别的二进制操作指令才能执行,位运算可以理解为省了中间转换的操作,处理器可以直接操作。事实是我们在某些源码经常能看见如下代码:


HashMap.class


/**
 * Returns a power of two size for the given target capacity.
 */
static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}


其实原理是一样的,处理器能够直接支持和处理。

相关文章
|
16天前
|
Java
Java中的抽象类:深入了解抽象类的概念和用法
Java中的抽象类是一种不能实例化的特殊类,常作为其他类的父类模板,定义子类行为和属性。抽象类包含抽象方法(无实现)和非抽象方法。定义抽象类用`abstract`关键字,子类继承并实现抽象方法。抽象类适用于定义通用模板、复用代码和强制子类实现特定方法。优点是提供抽象模板和代码复用,缺点是限制继承灵活性和增加类复杂性。与接口相比,抽象类可包含成员变量和单继承。使用时注意设计合理的抽象类结构,谨慎使用抽象方法,并遵循命名规范。抽象类是提高代码质量的重要工具。
31 1
|
1月前
|
前端开发 Java
java中的Queue队列的用法
java中的Queue队列的用法
19 1
|
1月前
|
XML Java 编译器
java aspectjrt AOP 用法
java aspectjrt AOP 用法
21 0
|
1月前
|
存储 Java 计算机视觉
Java代码居然可以做出如此高级的图片编辑系统
Java代码居然可以做出如此高级的图片编辑系统
29 0
|
1月前
|
Java 编译器 程序员
Java中的异常处理:从基础到高级
【2月更文挑战第24天】本文将深入探讨Java中的异常处理,从基础的try-catch块到高级的异常处理策略。我们将了解如何使用Java的异常处理机制来提高代码的健壮性和可维护性,以及如何处理运行时和编译时的异常。
22 0
|
6天前
|
JSON Java 数据格式
Java QueryWrapper基本用法
Java QueryWrapper基本用法
13 2
|
1月前
|
并行计算 安全 Java
深入理解Java并发编程:从基础到高级
【2月更文挑战第30天】 本文将深入探讨Java并发编程的核心概念和技术,包括线程、锁、同步、并发集合等。我们将从基础知识开始,逐步深入到高级主题,如Fork/Join框架、CompletableFuture和反应式编程。通过本文,你将能够理解并发编程的重要性,掌握Java中实现高效并发的关键技术和方法。
|
1月前
|
安全 Java 开发者
Java 8 `Optional` 类的用法和优势
【2月更文挑战第15天】
13 0
|
2月前
|
Java