在阅读部分 Java 源码时,一旦遇到大量位操作的情况理解效率就大幅下降,有没有什么好的 Java 教程或者书可以恶补下这一块?

2019-02-19 10:40:20 +08:00
 yamasa

如题。一个典型例子是 java 的 forkjoinpool 类。该类用了很多位操作来原子化操作 workerQueue 的状态等。位操作里大量做 mask 和位移的目的是什么?每次看这些源码都是疑惑重重。。java8 之后的 hashmap 和 concurrentHashMap 里也有部分位操作。现在位操作看不懂简直成了阅读源码的一大障碍。。求大神们指点下该怎么加强这一块的实践,以及有哪些常见的位操作模式?一般用于什么目的?

2980 次点击
所在节点    Java
12 条回复
luosuosile
2019-02-19 10:51:22 +08:00
帮顶
Yancey
2019-02-19 11:12:12 +08:00
smeraldo
2019-02-19 11:16:54 +08:00
这几个类注释都很不错的吧?再不济用搜索引擎+社区提问
stevenbipt
2019-02-19 11:24:07 +08:00
这么多位操作好像是为了效率高而且兼容性强,不理解的在知乎上有不少专栏有具体的解析,个人感觉为兼容性和高效那些 java 专家也是够拼的
LucasLee92
2019-02-19 11:29:39 +08:00
@stevenbipt 如果能推荐一些就很棒了
yamasa
2019-02-19 11:30:56 +08:00
@stevenbipt 看过知乎的部分相关的解析。说实话,个人感觉不是不够透彻就是有头无尾。有可以推荐下的吗
mortonnex
2019-02-19 11:34:09 +08:00
推荐一个今天上午刚刚看的 Random 类的解析,里面有一些位运算,这篇文章讲的还行:
https://t1174779123.iteye.com/blog/2037719
Raymon111111
2019-02-19 11:35:20 +08:00
大学教科书重新学一下就行

看文章什么的终究不成体系
bumz
2019-02-19 11:50:09 +08:00
位操作和加减乘除对理解有什么本质的区别吗,都是基本运算罢了

如果你不理解位运算写的代码,那比如我写堆的时候下标是 i, 2 * i + 1, 2 * i + 2 你也同样不理解究竟为何这样操作

归根结底不是因为位运算导致不理解代码,而是代码需要一定的数学基础或者说抽象思维能力才能理解

你得能想象出代码操作某种结构的过程,才能理解代码的目的
hitmanx
2019-02-19 11:58:43 +08:00
bit 运算只是表面,对于底层数据的表示是基础,核心是数学。有些库的底层运算的代码就是那种写完一次再也不会去读的那种:(举个例子 PopCount (就是求整数的 2 进制表示里有多少个 1 ),这是其中一种实现

https://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer

int numberOfSetBits(int i)
{
// Java: use >>> instead of >>
// C or C++: use uint32_t
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
smdbh
2019-02-19 12:10:50 +08:00
好好学习 c
aijam
2019-02-19 12:12:39 +08:00
感觉有很多需要实践积累。
举几个例子:
1. bitwise operator 和集合操作是同构的:
| 是并集
& 是交集
^ 是对称差

2. bit mask 基本操作:
turn bits on 用 |
turn bits off 用 &
toggle bits 用 ^

3. 整数位移 n 位相当于乘以 2 的 n 次方
x << n == x * pow(2, n)
x >> n == x / pow(2, n)

4. flag bits 用来压缩存储多个 boolean: 一个 32 位 int 相当于 32 个 boolean,但需要的空间是 4 bytes vs 32 bytes。求第 n 个 boolean 的值:flags >> n & 1 == 1。
比如有 b0 = false, b1 = true, b2 = false, b3 = true, b4 = true,压缩成 flags = 0b11010,求 b3 的值:(flags >> 3 & 1 == 1)是 true

5. xor 对称加密: message ^ secret == encrypted; encrypted ^ secret == message

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/536424

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX