如题。一个典型例子是 java 的 forkjoinpool 类。该类用了很多位操作来原子化操作 workerQueue 的状态等。位操作里大量做 mask 和位移的目的是什么?每次看这些源码都是疑惑重重。。java8 之后的 hashmap 和 concurrentHashMap 里也有部分位操作。现在位操作看不懂简直成了阅读源码的一大障碍。。求大神们指点下该怎么加强这一块的实践,以及有哪些常见的位操作模式?一般用于什么目的?
1
luosuosile 2019-02-19 10:51:22 +08:00
帮顶
|
2
Yancey 2019-02-19 11:12:12 +08:00
顶
|
3
smeraldo 2019-02-19 11:16:54 +08:00
这几个类注释都很不错的吧?再不济用搜索引擎+社区提问
|
4
stevenbipt 2019-02-19 11:24:07 +08:00 via Android
这么多位操作好像是为了效率高而且兼容性强,不理解的在知乎上有不少专栏有具体的解析,个人感觉为兼容性和高效那些 java 专家也是够拼的
|
5
LucasLee92 2019-02-19 11:29:39 +08:00
@stevenbipt 如果能推荐一些就很棒了
|
6
yamasa OP @stevenbipt 看过知乎的部分相关的解析。说实话,个人感觉不是不够透彻就是有头无尾。有可以推荐下的吗
|
7
mortonnex 2019-02-19 11:34:09 +08:00
推荐一个今天上午刚刚看的 Random 类的解析,里面有一些位运算,这篇文章讲的还行:
https://t1174779123.iteye.com/blog/2037719 |
8
Raymon111111 2019-02-19 11:35:20 +08:00
大学教科书重新学一下就行
看文章什么的终究不成体系 |
9
bumz 2019-02-19 11:50:09 +08:00
位操作和加减乘除对理解有什么本质的区别吗,都是基本运算罢了
如果你不理解位运算写的代码,那比如我写堆的时候下标是 i, 2 * i + 1, 2 * i + 2 你也同样不理解究竟为何这样操作 归根结底不是因为位运算导致不理解代码,而是代码需要一定的数学基础或者说抽象思维能力才能理解 你得能想象出代码操作某种结构的过程,才能理解代码的目的 |
10
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; } |
11
smdbh 2019-02-19 12:10:50 +08:00
好好学习 c
|
12
aijam 2019-02-19 12:12:39 +08:00 1
感觉有很多需要实践积累。
举几个例子: 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 |