diff --git a/algorithm/5、单链表.md b/algorithm/5、单链表.md index 27e6b40..ebd602b 100644 --- a/algorithm/5、单链表.md +++ b/algorithm/5、单链表.md @@ -51,6 +51,37 @@ private static Node reverDoubleLinkedList(Node head) { ### 位图 -位图的功能 -位图的好处 -位图的用法 +位图的功能 保存已知最大值的集合 +位图的好处 极大的节省空间 +位图的实现 java.util.BitSet + +```Java +public class BitMap { + private long[] bits; + + public BitMap(int max) { + bits = new long[(max + 64) >> 6]; + } + + // 给定数字除以64的结果result,模64的结果mod分开保存,bits[result]位置的mod位设置为1 + public void add(int num){ + // num&63等于num%64 + bits[num >> 6] |= (1L << (num & 63)); + } + + public void delete(int num){ + bits[num >> 6] &= ~(1L << (num & 63)); + } + + public boolean contains(int num){ + return (bits[num >> 6] & (1L << (num & 63))) != 0; + } +} +``` + +#### 位运算实现加减乘除 LeetCode29 + +加法add a^b结果为无进位相加,(a&b)<<1是进位信息,递归到进位信息为0,注意中间变量。 +减法delete add(a,add(~b,1)),取反加1后为负数。 +乘法 a左移b的每一位进制的位数相加。 +除法 先取绝对值,a右移到刚好大于等于b,拿到一个商,最后所有商相加,补上符号。对系统最小值特殊处理。