From 2da13ad662dbb5aaeee353ae5cc5ec05eed2e33b Mon Sep 17 00:00:00 2001 From: kn5886348135 <56352848+kn5886348135@users.noreply.github.com> Date: Wed, 23 Nov 2022 15:05:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=8D=E5=9B=BE=E3=80=81=E4=BD=8D=E8=BF=90?= =?UTF-8?q?=E7=AE=97=E5=AE=9E=E7=8E=B0=E5=8A=A0=E5=87=8F=E4=B9=98=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- algorithm/5、单链表.md | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) 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,拿到一个商,最后所有商相加,补上符号。对系统最小值特殊处理。