zoukankan      html  css  js  c++  java
  • 位运算

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

  • 相关阅读:
    React 16 源码瞎几把解读 【前戏】 为啥组件外面非得包个标签?
    nodejs 使用redis 管理session
    nodejs 优雅的连接 mysql
    mongodb 学习笔记 3 --- 查询
    mongodb 学习笔记 2 --- 修改器
    mongodb 学习笔记--- 基础知识
    看jquery3.3.1学js类型判断的技巧
    FIS3 大白话【一】
    Flutter 插件开发:以微信SDK为例
    最新Android面试题整理,收藏下吧值得拥有!
  • 原文地址:https://www.cnblogs.com/tomatokely/p/14764719.html
Copyright © 2011-2022 走看看