• 第 1 章 第 2 题 位向量的数组实现问题 位运算实现


    问题分析

      位向量可以定义为一个模拟数组(整型数组)。所谓的“ 实现位向量 ”也就是定义函数,实现对模拟数组中指定【位】的设置,清空,以及测试。

    函数实现

     1 // 每个整数的位数
     2 #define BITSPERWORD 32
     3 // 每次位移量
     4 #define SHIFT 5
     5 // 取模掩码
     6 #define MASK 0x1F
     7 // 位向量的元素个数
     8 #define N 10000000
     9 
    10 // 模拟数组
    11 int a[1 + N/BITSPERWORD];
    12 
    13 /*
    14  * 函数功能:置位向量第i位为1
    15  * 函数说明:" i>>SHIFT "等于" i/32 " 获取到位向量目标位对应的模拟数组元素的位置
    16             " i & MASK "等于" i%32 " 获取到位向量目标位在对应的模拟数组元素中的位置
    17             " 1<<(i & MASK) " 表示一个除了要设置的那位其他位都是0的整数
    18 */
    19 void set (int i) {
    20     a[i>>SHIFT] |= (1<<(i & MASK));
    21 }
    22 
    23 /*
    24  * 函数功能:置位向量第i位为0
    25  * 函数说明:" i>>SHIFT "等于" i/32 " 获取到位向量目标位对应的模拟数组元素的位置
    26             " i & MASK "等于" i%32 " 获取到位向量目标位在对应的模拟数组元素中的位置
    27             " 1<<(i & MASK) " 表示一个除了要清空的那位其他位都是0的整数
    28 */
    29 void clr (int i) {
    30     a[i>>SHIFT] &= ~(1<<(i & MASK));
    31 }
    32 
    33 /*
    34  * 函数功能:获取位向量的第i位
    35  * 函数说明:" i>>SHIFT "等于" i/32 " 获取到位向量目标位对应的模拟数组元素的位置
    36             " i & MASK "等于" i%32 " 获取到位向量目标位在对应的模拟数组元素中的位置
    37             " 1<<(i & MASK) " 表示一个除了要获取的那位其他位都是0的整数
    38 */
    39 int tst (int i) {
    40     return a[i>>SHIFT] & (1<<(i & MASK));
    41 }

    小结

      1. 位操作与整数操作的关系对应是解答本题的关键

      2. 位向量用C++的bitset容器来实现更方便,但本题规定用位逻辑运算实现。

  • 相关阅读:
    深入了解JVMzz
    正则表达式和Java编程语言1zz
    全世界所有程序员都会犯的错误zz
    C++完美实现Singleton模式zz
    Visual C++6.0 API函数操作技巧集zz光标和鼠标操作
    用next_permutation()生成r组合数,兼VC7的一个bugzz
    基于逆向最大化词表中文分词法zz
    c#.net常用函数列表
    Windows多线程多任务设计初步zz
    在Linux中实现内部进程通信
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3237798.html
Copyright © 2020-2023  润新知