位向量

看了编程珠玑第一章练习题第二题,关于位向量使用逻辑运算符实现的问题。

首先,位向量不明白: 位向量是一种高效的整数结构,每一个32位的整数通过设置或清除它的某一位,可以保存32个数。如果是一个数组,则可以存更多的数。题目意思是使用一个整数表示32个数,可以使多个整数组成的数组,如int a[2]表示两个整数,位向量表示64个数;目前我以为这个主要用来排序,以后有新功能再修改。

其次,编程珠玑给了样例: enum { BITSPERWORD = 32, SHIFT = 5, MASK = 0x1F };

 1  void set(int i)
 2         {
 3             a[i>>shift] |=(1<<(i&mask));
 4         }
 5
 6         void clr(int i)
 7         {
 8             a[i>>shift] &=~(1<<(i&mask));
 9         }
10
11         int test(int i)
12         {
13             return a[i>>shift]&(1<<(i&mask));
14         }  

开始没看到,在网上搜了下别人的讲解,有个对上面set clr test 的更详细的转换:

 1 void set(int i)
 2 {
 3     a[i / 32] |= (1 << (i % 32));
 4 }
 5 void clr(int i)
 6 {
 7     a[i / 32] &= ~(1 << (i % 32));
 8 }
 9 int test(int i)
10 {
11     return a[i / 32] & (1 << (i % 32));
12 }

利用这个把逻辑运算取代一下效果是一样的,更容易理解。不过题目要求使用上一个逻辑函数。

推荐一个链接:http://blog.csdn.net/guosong421/article/details/5493705

位向量

时间: 2024-10-30 09:37:24

位向量的相关文章

【读书笔记】《编程珠玑》第一章之位向量&amp;位图

此书的叙述模式是借由一个具体问题来引出的一系列算法,数据结构等等方面的技巧性策略.共分三篇,基础,性能,应用.每篇涵盖数章,章内案例都非常切实棘手,解说也生动有趣. 自个呢也是头一次接触编程技巧类的书籍,而且算法数据结构方面的知识储备实在是薄弱,这么看来,纯粹找虐啊orz.今此行为,歇业养伤,实属无聊.也可说是自打毕业后,看书如打仗,自视身处"安安稳稳的和平年代",闲来了也就闲着,忧患意识甚少,有也退退缩缩.话说回来,这本书不像CLRS那种难打的硬仗(现在想想都脑仁疼啊),<Pr

第10章 bit_vector位向量容器

第10章 bit_vector位向量容器   10.1 bit_vector技术原理   10.2 bit_vector应用基础   10.3 本章小结 这本书讲bit_vector,而不讲bitset容器,有点奇怪.   略

关于位向量的笔记

在<编程珠玑>中提到一个用位向量解决排序的问题,其具体的要求如下: 输入:一个包含最多n个整数的文件,每个整数都小于n,且无重复 输出:按升序排列的输入整数的列表 约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用.运行时间最多几分钟,运行时间为10秒就不需要进一步优化了. 基本的思路是这样的:用n个位表示0-n之间的整数,其中位的状态分为0和1两种,0表示这个整数没有出现,1表示出现了.输出时遍历每一位,状态为1则输出该位的序号,即为整数值.不能用一个变量表示一个位,因为这样

位向量法构造子集

/*子集生成位向量法*/ #include<cstdio> int B[20]; void print_subset(int n,int *B,int cur) { if(cur == n) { for(int i=0;i<cur;i++) if(B[i]) printf("%d ",i); printf("\n"); return ; } B[cur]=1; print_subset(n,B,cur+1); B[cur]=0; print_sub

[编程珠玑]如何使用位逻辑来实现位向量

编程珠玑开篇的一道题目是这样的: 如何使用位逻辑运算(如与.或.移位)来实现位向量? 一.何为位向量? 在许多情况下(如对象为满足或不满足某条性质的情况),用一个二进制位就足够表示一个对象了.但是,不能用一个变量名直接表示一个位(不存在单独为一位的数据类型).于是,就考虑将多个位组成一个基本数据类型,通过对这个基本数据类型的操作,达到使用位的方法.同时,为了方便,把由位组成的基本数据类型组成数组,这样,就可以对一定范围的位数据集合进行操作.我们把这种形式的数据结构称为位向量. 接下来,再考虑一点

【算法竞赛入门经典】7.3子集生成【增量构造法】【位向量法】【二进制法】

7.3.1增量构造法 思路:一次选出一个元素放到集合中.自己对于递归的理解还是不够,这里虽然没有明确给出递归停止条件,但是如果无法继续添加元素,就不会再继续递归,然后就是我头疼的回溯啦. #include<stdio.h> int num[4],n; void A(int n,int *a,int ans) { for(int i = 0; i < ans; i ++)//打印当前元素 printf("%d ",a[i]); printf("\n"

【算法设计-散列表】散列表的直接定址法与位向量

位向量(bit vector)是一个仅包含0和1的数组.长度为m的位向量所占空间要比包含m个指针的数组少的多.用一个位向量来表示一个包含不同元素的动态集合.字典操作的运行时间为0(1) 代码: #include <stdio.h> #include <stdlib.h> #define INT_BIT 32 typedef struct { unsigned int *table; int size; } BitMap; BitMap * bitmap_create(int max

java 位向量

public class BitVectory { private int count; private int[] a; private static final int BIT_LEN = 32; private static final int MASK = 0x1f; //16禁止表示 10进制31 private static final int SHIFT = 5; public BitVectory(int count) { this.count = count; init(cou

子集生成——增量构造法+位向量法+二进制法

1.增量构造法: 原理图: 1 // 此算法仅用于输出下标,实际运用应输入另一个数组来进行数据的储存 2 #include <bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define INF 0X3f3f3f3f 7 const ll MAXN = 1e3 + 7; 8 const ll MOD = 1e9 + 7; 9 int a[10];