第 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容器来实现更方便,但本题规定用位逻辑运算实现。

原文地址:https://www.cnblogs.com/scut-fm/p/3237798.html