• 位运算


    位运算符
      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

  • 相关阅读:
    VC编译器
    位域
    位域2
    函数调用时刻的堆栈情况
    字节对齐2
    Python学习笔记(6)while循环、while嵌套
    Python学习笔记(7)字符串Str
    Python学习笔记(3)输出、输入、输出输入综合小练习
    Python学习笔记(1)Python介绍、解释器、第一个python程序、注释
    Python学习笔记(4)运算符、运算符小练习
  • 原文地址:https://www.cnblogs.com/tomatokely/p/14764719.html
Copyright © 2020-2023  润新知