在很多源代码中看到用BIT来提升效率,所以这里做一些总结,bit 有哪些秒用;
分类问题:
https://blog.csdn.net/hhy107107/article/details/82801780;
使用0 1 对一堆数进行划分; 每个整数有1-32个比特,对一堆数按照 bit=0|1 来划分;
还有就是老鼠找毒药的题目非常的经典;
求集合的子集合问题
对于一个集合比如【1,2,3,4】,求他的子集,通常我们的方法是用递归,其实还有很优雅的使用
bit 的方法。 子集和一共有 2^n-1 个,集合中的元素,每一个就有选择或者不选择的状态;
对于让和一个 2^n-1 以内的数; 他的 bit 表示中的 1 代表这个数字会被选择;
那么我们就可以遍历,1- 2^n-1的所有数,然后 对于每个数,把 比特1 对应的 nums[i]挑出来,就可以组成一个子集;
效率问题:
%mod 的运算,使用比特代替。 x%y = x &(y-1) 如果 y 是 2的幂次;比如 8,16,32;这是hashMap运用到的;
hash更加分散,除mod的时候,低位作用比较明显,高位也需要参与进来;
(h = key.hashCode()) ^ (h >>> 16);使用异或;
hashMap里面的bit 运算和运用;
https://www.cnblogs.com/life-of-coding/p/12066962.html
StampLock 的 位运算
https://blog.csdn.net/xindoo/article/details/105029680?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.pc_relevant_antiscan_v2&spm=1001.2101.3001.4242.1&utm_relevant_index=3
Long 64位来表示state; 7位为 读线程数, 1位为写线程标识; 58位为 version timestamp;
其中,读写互斥; 另外乐观读和写不互斥,但是要先检查version;
我们自己也可以试试如何用一个long state 来实现这样的乐观锁机制;
在 java concurrent util 包里面,还有很多使用 bit 运算的地方,比如线程池,aqs 等利用 int 标识状态,复用一个int 的bit位;