问题分析
位向量可以定义为一个模拟数组(整型数组)。所谓的“ 实现位向量 ”也就是定义函数,实现对模拟数组中指定【位】的设置,清空,以及测试。
函数实现
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容器来实现更方便,但本题规定用位逻辑运算实现。