位运算

位运算符
  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 = a+ 3/32 | (1<<3)  = 0000 0000 0000 0000 0000 0000 0000 1100 

总结3:插入公式: a= 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

原文地址:https://www.cnblogs.com/tomatokely/p/14764719.html