关于"位操作"有没有什么中文文档啊?

来源:4-10 -reactor线程任务的执行

南国漂泊

2018-07-17

  • io.netty.util.concurrent.SingleThreadEventExecutor


// Check timeout every 64 tasks because nanoTime() is relatively expensive.
// XXX: Hard-coded value - will make it configurable if it is really a problem.
if ((runTasks & 0x3F) == 0) {
    lastExecutionTime = ScheduledFutureTask.nanoTime();
    if (lastExecutionTime >= deadline) {
        break;
    }
}
  • if ((runTasks & 0x3F) == 0) {

  • 经常看到这种位操作,但是理解起来很困难,老师,同学们有没有什么好的文档推荐啊?!

感谢闪电侠老师提供的链接  java二进制相关基础 - 微信 ,这篇文章让我受益良多,特别是老师说的把数字二进制展开,画一画,非常实用。我以 0x3f 为关键字在百度搜索也得到了一些启示,链接列在文末。加上之前收藏的英文链接也一并列在文末。

long runTasks = 0;
runTasks ++;
if ((runTasks & 0x3F) == 0) {

long : 64bit, 表示64bit太长了,所以高位省略……(高位?对不对?)

0x3f : 16进制 > 0011 1111 < 63
                 ^    ^
                 3    f
               0100 0000 < 64
                 ^    ^
                 4    0
               0100 0001 < 65
                 ^    ^
                 4    1
a & b : 按位与, 只有a,b都为1, a&b才为1; 否则为0

按照上面的图示, a & 0x3f , 当 a 的低6位为0时, a & 0x3f 的结果为 0

满足 a & 0x3f == 0 的最小的 a 为 64, a = 65就不满足了, 必须是64的倍数

这样 if (a & 0x3f == 0) {...} 实际上是相当于 if (a % 64 == 0) {...}

那是否说明只要是求余就可以用上面表达方式替换呢?

答案是否定的,必须是 2 的N次方 才能这样使用, 我们自己还是老实的使用`%`比较好

a     : 0011 < 3
b     : 0011
a & b : 0011 < 不等于0

a     : 0110 < 6 = 2*N
b     : 0011
a & b : 0010 < 不等于0

a     : 1000 < 8 = 2^N
b     : 0111 < 7
a & b : 0000 < 等于0

一开始我写的是 "2 的倍数" ,后来思考了一下发现有问题,因为 6 是 2 的倍数但是不满足条件,所以我将 "2 的倍数" 改为 "2 的N次方" ,然后,过了一段时间,我开始怀疑是否要将 "64的倍数" 改为 "64的N次方",我以 4 为例在纸上画了一遍发现,不用改。现在把过程附上。

a     : 0000 0100 < 4 
b     : 0000 0011 < 3
a & b : 0000 0000

a     : 0000 1000 < 8
a     : 0000 1100 < 12
a     : 0001 0000 < 16
a     : 0001 0100 < 20
a     : 0001 1000 < 24
a     : 0001 1100 < 28
a     : 0010 0000 < 32


吐槽一下慕课问答区:我在编辑器特意以空格(非tab)排好了位置,复制到这里就“格式乱了”,我好不容易在这里又一次的输入了空格排好位置,预览时发现“格式不对”,我…… 好累啊,不知为何不使用markdown编辑器?!!!

  1. [类似于0x3F是什么意思?怎么转换?](https://zhidao.baidu.com/question/454647025860717045.html)

  2. [c语言&0x3f 为什么就是等于除于64求余数](https://zhidao.baidu.com/question/460892986.html)

  3. https://www.geeksforgeeks.org/bitwise-algorithms/#basics

  4. https://leetcode.com/tag/bit-manipulation/

3、4是英文的,我没看懂,也不打算现在这个阶段去阅读了,有兴趣有能力的同学可以前去研究。



写回答

1回答

闪电侠

2018-07-17

只要记住几个位操作符,然后刚开始如果看不懂,可以把数字二进制展开,画一画就行,然后这里有一个资料可以看看:https://mp.weixin.qq.com/s/AIvthkKEqacnfZBIZAxSKA,这个公众号强烈建议关注一下,干货很多!

0
3
闪电侠
回复
南国漂泊
客气啦!
2018-07-19
共3条回复

Java读源码之Netty深入剖析

解析netty各大组件细节,百万级性能调优,设计模式实际运用

2334 学习 · 283 问题

查看课程