V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yamasa
V2EX  ›  Java

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

  •  
  •   yamasa · 2019-02-19 10:40:20 +08:00 · 2952 次点击
    这是一个创建于 1864 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    你得能想象出代码操作某种结构的过程,才能理解代码的目的
    hitmanx
        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;
    }
    smdbh
        11
    smdbh  
       2019-02-19 12:10:50 +08:00
    好好学习 c
    aijam
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1036 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:22 · PVG 06:22 · LAX 15:22 · JFK 18:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.