美文网首页
那些精妙的位操作(持续更新)

那些精妙的位操作(持续更新)

作者: 网易热孩子 | 来源:发表于2019-03-24 13:26 被阅读0次

个人兴趣原因, 会尝试阅读很多开源的框架以及语言的源代码。也发现了很多精妙的位运算, 如果本人来实现可能需要各种繁琐的计算。但是别的开发者大多数情况只需一句话就搞定了。感触颇深, 现总结如下:

判断val是否是2的幂次方

private static boolean isPowerOfTwo(int val) {
    return (val & -val) == val;
}

代码出自Netty。详情可见 https://github.com/netty/netty/blob/00afb19d7a37de21b35ce4f6cb3fa7f74809f2ab/common/src/main/java/io/netty/util/concurrent/DefaultEventExecutorChooserFactory.java

能看到该类被打上了@UnstableApi标签。的确在master目前已经找不到该类的踪迹了。

hotspot的object alignment

// 这里是向上对齐的宏。比如size是20. 对齐大小alignment是8, 则尝试对齐到24=8*3.
#define align_size_up_(size, alignment) (((size) + ((alignment) - 1)) & ~((alignment) - 1))
// 这里是向下对齐的宏。比如size是20. 对齐大小alignment是8, 则尝试对齐到16=8*2.
#define align_size_down_(size, alignment) ((size) & ~((alignment) - 1))  

代码出自大名鼎鼎的hotspot。用来处理对象对齐。详情可见
http://hg.openjdk.java.net/jdk-updates/jdk9u/hotspot/file/22d7a88dbe78/src/share/vm/utilities/globalDefinitions.hpp#l484

typeArrayOop.hpp(2019.03.28 update)

http://hg.openjdk.java.net/jdk-updates/jdk9u/hotspot/file/22d7a88dbe78/src/share/vm/oops/typeArrayOop.hpp#l156

// 这里偷了个巧。LogHeapWordSize在64位下默认是3, 这里等于是除以8. 然后通过左边添加(HeapWordSize-1)来保证除后的HeapWord个数刚好能包住bytes。
julong size_in_words = ((size_in_bytes + (HeapWordSize-1)) >> LogHeapWordSize);

计算内存对齐(2019.04.03 update)

http://hg.openjdk.java.net/jdk-updates/jdk9u/hotspot/file/22d7a88dbe78/src/share/vm/memory/allocation.hpp#l42

思路是和 typeArrayOop.hpp 的方式一致。

相关文章

网友评论

      本文标题:那些精妙的位操作(持续更新)

      本文链接:https://www.haomeiwen.com/subject/tpcuvqtx.html