位运算
0?0 | 0?1 | 1?1 | 规则 | |
& | 0 | 0 | 1 | 都为1时才为1 |
| | 0 | 1 | 1 | 一个为1即为1 |
^ | 0 | 1 | 0 | 同时为0,不同为1 |
~ 按位取反
<< 左移运算符,num<<1 == num*2
>> 右移运算符,num>>1 == num/2
应用——交换两个数
a=a+b;
b=a-b;
a=a-b;
或
a=a^b;
b=a^b;
a=a^b;
BitMap 位图
假设欲存储100以内的质数
一个int型整数占4字节,100以内有25个质数,占4*25=100字节。
用位图存储,位数代表该元素,位上的值代表是否有该元素,100以内的数,只需要100位,即100/32+1=4字节。
总结1:需要位图大小,可用 type_name bmp[ N / type_size + 1 ] 计算,其中N代表欲存储的最大值。
bmp[0]
0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
bmp[1]
0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
bmp[2]
0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 |
bmp[3]
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 |
总结2:给定一个数M,求其行数 M / type_size,求其列数 M % type_size
a0 = 0
插入:放入质数2,2/32=0,2%32=2,即应放入第0行第2列。 a1 = a0 +2/32 | (1<<2) = 0000 0000 0000 0000 0000 0000 0000 0100
放入质数3,3/32=0,3%32=3,即应放入第0行第3列。 a2 = a1 + 3/32 | (1<<3) = 0000 0000 0000 0000 0000 0000 0000 1100
总结3:插入公式: an = an-1 + (i / type_size) | (1<< (i%type_size))
删除:删除37, ~ (1 << (37%32) ) 该位置0,其他位置1。 bmp[37/32] & ~ (1 << (37%32) ) 。
总结3:删除公式: bmp[ i / type_size ] = bmp[ i / type_size ] & ~ (1<< (i%type_size))
查找:查找73存不存在,bmp[73/32] & (1<<73%32) == 1 ? true : false ;
总结4:查找公式:bmp[ i / type_size ] & (1<< (i%type_size)) == 1 ? true : false
应用——排序
eg. 给array[5]={5,1,3,7,4} 排序
unsigned char num = 0;
int size = sizeof(unsigned char)*8;
for (int i = 0; i < 5; i++) {
num += (array[i]/size) | (1 << array[i] % size);
}
for (int i = 0; i < 8; i++) {
if ((num & (1 << i)) != 0)
cout << i;
}
优点:效率高,内存少
缺点:数据不能重复,数值密集才有优势
真题:https://www.cnblogs.com/ToBeDeveloper-Zhen/p/8576901.html