当前位置:编程学习 > C/C++ >>

位图排序概要 编程珠玑(第一章)-----学习笔记

位图或者位向量可以表示一系列序列集合,比如:可用一个20位长的字符串来表示一个所有元素都小于20的简单的非负整数集合。例如可用如下字符串表示集合

{1,2,3,5,8,13}: 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 集合中为1的代表整数集合中的该数。

这种表示有一些限制:输入数据限制在相对较小的范围内,数据没有重复,而且对于每条记录而言,除了单一整数外,没有任何其他关联数据。

分三个自然阶段来编写程序,第一阶段讲所有为都置为0,从而讲集合初始化为空,第二阶段通过读入文件中的每个整数来建立集合,将每个对应位都置为1,第三阶段

检验每一位,如果该位为1,就输出对应的整数,由此产生有序的输出文件。


[cpp] 
#include <stdio.h>  
#define MAX 1000000  
#define SHIFT 5             
#define MASK 0x1F  
#define DIGITS 32  
int a[1+MAX/DIGITS]; 
 
void set(int n)     //将逻辑位置为n的二进制位置为1   

    a[n>>SHIFT]=a[n>>SHIFT]|(1<<(n&MASK));     //n>>SHIFT右移5位相当于除以32求算字节位置,n&MASK相当于对32取余即求位位置,  
}                                              //然后将1左移的结果与当前数组元素进行或操作,相当于将逻辑位置为n的二进制位置1.    
 
void clear(int n) 

    a[n>>SHIFT]=a[n>>SHIFT]&(~(1<<(n&MASK)));   //将逻辑位置为n的二进制位置0,原理同set操作   

 
int test(int n) 

    return a[n>>SHIFT] & (1<<(n&MASK));        //测试逻辑位置为n的二进制位是否为1   

 
int main() 

    int i,n; 
    for(i=1;i<=MAX;i++) 
    { 
        clear(i); 
    }     
    while(scanf("%d",&n)!=EOF) 
    { 
        set(n); 
    } 
    for(i=1;i<=MAX;i++) 
    { 
        if(test(i)) 
            printf("%d ",i); 
    } 
    return 0; 

#include <stdio.h>
#define MAX 1000000
#define SHIFT 5          
#define MASK 0x1F
#define DIGITS 32
int a[1+MAX/DIGITS];

void set(int n)     //将逻辑位置为n的二进制位置为1
{
    a[n>>SHIFT]=a[n>>SHIFT]|(1<<(n&MASK));     //n>>SHIFT右移5位相当于除以32求算字节位置,n&MASK相当于对32取余即求位位置,
}                                              //然后将1左移的结果与当前数组元素进行或操作,相当于将逻辑位置为n的二进制位置1. 

void clear(int n)
{
    a[n>>SHIFT]=a[n>>SHIFT]&(~(1<<(n&MASK)));   //将逻辑位置为n的二进制位置0,原理同set操作
}

int test(int n)
{
    return a[n>>SHIFT] & (1<<(n&MASK));        //测试逻辑位置为n的二进制位是否为1
}

int main()
{
    int i,n;
    for(i=1;i<=MAX;i++)
    {
        clear(i);
    }   
    while(scanf("%d",&n)!=EOF)
    {
        set(n);
    }
    for(i=1;i<=MAX;i++)
    {
        if(test(i))
            printf("%d ",i);
    }
    return 0;
}
这里是c的实现代码,每个字节32位,所以需要/32来找到字节位,然后n要和32取余,n%32,转化为为操作就是n&0x1F。

c++中有现成的数据结构bitset<>可以用,简单使用:


[cpp] 
#include <iostream>  
#include<bitset>   
#define MAX 1000000  
using namespace std; 
 
bitset<MAX+1> bit;        //声明一个有(MAX+1)个二进制位的bitset集合,初始默认所有二进制位为0   
 
int main() 

    int n,i; 
    while(cin>>n) 
    { 
        bit.set(n,1);          //将第n位置1                 
    }     
    for(i=0;i<=MAX+1;i++) 
    { 
        if(bit[i]==1) 
            cout<<i<<endl; 
    } 
    return 0; 

#include <iostream>
#include<bitset>
#define MAX 1000000
using namespace std;

bitset<MAX+1> bit;        //声明一个有(MAX+1)个二进制位的bitset集合,初始默认所有二进制位为0

int main()
{
    int n,i;
    while(cin>>n)
    {
        bit.set(n,1);          //将第n位置1              
    }   
    for(i=0;i<=MAX+1;i++)
    {
        if(bit[i]==1)
            cout<<i<<endl;
    }
    return 0;
}

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,