第 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
类模板是C++中一种通用的编程技术,它允许我们定义一个模板类,在这个类中可以使用任意类型的数据。因此,我们可以使用类模板来实现向量运算。 首先,我们可以定义一个名为Vector的类模板,其中包含私有数据成员和公共成员函数。私有数据成员可以包括向量的元素以及向量的大小。公共成员函数则可以包括向量的初始化、复制、加法、减法、点乘和输出等操作。 在类模板中,我们可以使用模板参数来表示向量的元素类型。例如,使用typename T来表示元素类型。这样,在模板类中,我们可以使用T来声明向量的元素数组。 接下来,我们可以实现类模板中的各个成员函数。例如,我们可以使用构造函数来初始化向量的大小,并使用析构函数来释放内存。我们还可以使用复制构造函数和赋值运算符重载函数来实现向量的复制操作。 在加法、减法和点乘运算中,我们可以使用循环语句遍历向量的元素,并进行相应的运算。最后,我们可以使用输出函数来显示向量的元素。 使用类模板实现向量运算的好处是,我们可以在运行时根据需要实例化类模板,并使用不同类型的数据来进行运算。这样,我们可以更加灵活地处理不同类型的向量操作。 综上所述,我们可以通过实现一个类模板来实现向量运算。这种方法可以使我们更加灵活地处理不同类型的向量,并实现各种向量运算的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值