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;
}


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

相关文章
|
8月前
|
Java 数据安全/隐私保护 计算机视觉
Java位运算的详解
总的来说,Java位运算是一种强大的工具,它可以让我们直接操作整数的二进制位,实现各种复杂的功能。但是,位运算也是一把双刃剑,如果不正确地使用,可能会导致各种难以预料的问题。因此,使用位运算时,一定要小心谨慎,确保理解了每个运算的含义和效果。
233 24
|
12月前
|
存储 Java
Java中的位运算
本文介绍了位运算符的基础知识,包括原码、反码、补码的概念,以及常见的位运算符(如移位运算符 `&lt;&lt;`、`&gt;&gt;`、`&gt;&gt;&gt;` 和逻辑运算符 `&`、`|`、`^`、`~`)的使用方法和规则。通过具体的二进制示例,详细解释了这些运算符的工作原理,帮助读者更好地理解位运算在计算机中的应用。
178 2
Java中的位运算
|
12月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
10550 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
1250 3
|
Java
Java 正则表达式高级用法
Java 中的正则表达式是强大的文本处理工具,用于搜索、匹配、替换和分割字符串。`java.util.regex` 包提供了 `Pattern` 和 `Matcher` 类来高效处理正则表达式。本文介绍了高级用法,包括使用 `Pattern` 和 `Matcher` 进行匹配、断言(如正向和负向前瞻/后顾)、捕获组与命名组、替换操作、分割字符串、修饰符(如忽略大小写和多行模式)及 Unicode 支持。通过这些功能,可以高效地处理复杂文本数据。
229 10
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
137 10
|
安全 Java
Java switch case隐藏用法
在 Java 中,`switch` 语句是一种多分支选择结构,常用于根据变量值执行不同代码块。除基本用法外,它还有多种进阶技巧,如使用字符串(Java 7 开始支持)、多个 `case` 共享代码块、不使用 `break` 实现 “fall-through”、使用枚举类型、使用表达式(Java 12 及以上)、组合条件以及使用标签等。这些技巧使代码更加简洁、清晰且高效。
401 1
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
427 2
|
Java 开发者
Java中的并发编程:从基础到高级
在Java世界中,并发编程是一项至关重要的技能。本文将深入探讨Java并发编程的核心概念、实用工具和高级技术。我们将从线程基础出发,逐步过渡到线程池的使用,最后探索Java并发包中的强大工具,如CyclicBarrier、Semaphore和CountDownLatch。无论你是Java新手还是资深开发者,这篇文章都将为你提供有价值的见解和技巧,帮助你在多线程环境中编写出更加高效、稳定的代码。 【7月更文挑战第30天】
129 7
|
Java 程序员 API
Java中的异常处理:从基础到高级
【7月更文挑战第28天】在Java编程的世界中,异常处理是一块基石,它确保了程序的健壮性和可靠性。本文将带领读者深入理解Java的异常处理机制,从基本的try-catch语句开始,逐步探索更复杂的异常处理策略,如finally块、自定义异常以及异常链。我们还会讨论如何在设计良好的API时利用异常处理来提高用户体验。通过这篇文章,读者将能够更加自信地处理各种异常情况,编写出更加稳定和用户友好的Java应用程序。