免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2807 | 回复: 4
打印 上一主题 下一主题

bit_vector程序莫名错误,求帮助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-29 22:13 |只看该作者 |倒序浏览
本帖最后由 sudayly 于 2011-10-29 22:25 编辑

写了个位向量的实现文件,在测试的时候碰到一个问题,不知道错误在哪里,大虾帮忙帮忙看看啊~

测试代码main.cc
  1. #include "bit_vector.h"
  2. #include <cassert>

  3. int main(int argc, char *argv[])
  4. {
  5.   bit_vector bv(128);
  6.   for (int i=0; i<128; i+=2) {
  7.     bv.put(i);
  8.   }
  9.   bv.print(); // 这边看的出bv.put的操作都是对的
  10.   for (int i=0; i<128; i+=2) {
  11.     assert(bv.get(i)); // == 1
  12.   }
  13.   return 0;
  14. }
复制代码
出错信息


而下面的测试内容却能通的过。。
  1. #include "bit_vector.h"
  2. #include <cassert>

  3. int main(int argc, char *argv[])
  4. {
  5.   bit_vector bv(128);
  6.   // for (int i=0; i<128; i+=2) {
  7.   //   bv.put(i);
  8.   // }
  9.   // bv.print();
  10.   // for (int i=0; i<128; i+=2) {
  11.   //   assert(bv.get(i)); // == 1
  12.   // }
  13.   bv.put(0);
  14.   bv.put(127);
  15.   assert(bv.get(0));
  16.   assert(bv.get(127));
  17.   return 0;
  18. }
复制代码
bit_vector.h代码
  1. #ifndef BIT_VECTOR
  2. #define BIT_VECTOR
  3. /*
  4. * bit_vector.h
  5. *
  6. * 使用二进制位存放向量的数据结构。举个例子,如果我们有个向量{1,2,4,7,15},
  7. * 那么,用二进制位可以表示成 10000000 10010110,从右往左看,第n位为1表示
  8. * n处在向量中(从0开始)。
  9. *
  10. * 使用示例:
  11. *  bit_vector bv(64); // 能存放[0, 64)的整数
  12. *  bv.put(0);
  13. *  bv.print();
  14. *  bv.put(63);
  15. *  bv.print();
  16. *  bv.get(0); // 1
  17. *  bv.get(1); // 0
  18. *  bv.get(63); // 1
  19. */
  20. #include <cstdio>
  21. #define INT_BITS (sizeof(int)*8)

  22. class bit_vector {
  23.   int * bits_;
  24.   int n_;

  25. public:
  26.   // 申请n位的位向量,并初始化为0
  27.   bit_vector(int n=INT_BITS){
  28.     n_ = n / INT_BITS;
  29.     if (n % INT_BITS != 0) {
  30.       n_++;
  31.     }
  32.     bits_ = new int[n_];
  33.     for (int i=0; i<n_; ++i) {
  34.       bits_[i] = 0;
  35.     }
  36.   }

  37.   // 清除申请的内存
  38.   ~bit_vector() {
  39.     delete bits_;
  40.   }

  41.   // 把数m放入位向量中,即位向量的第m位置为1
  42.   void put(int x) {
  43.     int i = x / INT_BITS;
  44.     int j = x % INT_BITS;
  45.     bits_[i] |= 1 << j;
  46.   }

  47.   // 如果数x在位向量中,返回1,否则返回0
  48.   int get(int x) {
  49.     int i = x / INT_BITS;
  50.     int j = x % INT_BITS;
  51.     return bits_[i] &= 1 << j;
  52.   }
  53.   
  54.   // 打印出位向量
  55.   void print() {
  56.     for (int i=n_-1; i>=0; --i) {
  57.       printf("%08x ", bits_[i]);
  58.     }
  59.     printf("\n");
  60.   }
  61. };
  62. #endif // BIT_VECOTR
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-10-29 22:23 |只看该作者
回复 1# sudayly


    还发现下段代码也出错
  1. bv.pet(5);
  2. assert(bv.get(5));
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-10-29 23:09 |只看该作者
回复 1# sudayly


找到错误了,在bit_vector.h的get成员函数中,原本的代码是:
return bits_ &= 1 << j;
实际上应该为
return bits_ & 1 << j;

论坛徽章:
0
4 [报告]
发表于 2011-10-29 23:20 |只看该作者
// 如果数x在位向量中,返回1,否则返回0
  int get(int x) {
    int i = x / INT_BITS;
    int j = x % INT_BITS;
    return bits_[i] &= 1 << j;   
  }

应该return bits_[i] & (1 << j);
不过我没测试,呵呵

论坛徽章:
0
5 [报告]
发表于 2011-10-29 23:25 |只看该作者
回复 4# programer_liu


    是的,就是这里,刚找到错误~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP