转自http://blog.chinaunix.net/uid-26548237-id-3759520.html
如何使用位逻辑(例如与、或、移位)来实现位向量?
解答:
代码如下所示。
//如何使用位逻辑运算(例如与、或、移位)来实现位向量
/* Copyright (C) 1999 Lucent Technologies */
/* From 'Programming Pearls' by Jon Bentley */
/* bitsort.c -- bitmap sort from Column 1
* Sort distinct integers in the range [0..N-1]
* 排序在0到N-1范围内的无重复整数
*/
#include <stdio.h>
#define BITSTEPWORD 32 //表示一个整型含有32个位
#define SHIFT 5 //单次位移量
#define MASK 0x1F //掩码
#define NUM 10000000 //表示1000万个整数
int array[1 + NUM / BITSTEPWORD];//使用整型数组模拟定义1000万个位的数组
/*功能:设置位数组中的从0开始的第i位为1
*参数:需要设置为1的位
*/
void set(int i)
{
array[i >> SHIFT] |= (1 << (i & MASK));
}
/*
*功能:设置位数组中的从0开始的第i位为0
*参数:需要设置为0的位
*/
void clr(int i)
{
array[i >> SHIFT] &= ~(1 << (i & MASK));
}
/*
*功能:取出从0开始的第i位的值,用于检测
*/
void test(int i)
{
return array[i >> SHIFT] & (i << (i & MASK));
}
int main(void)
{
int i;
clear();
for( i = 0; i < 100; i++ )
set( i*2 );
for( i = 0; i < 200; i++ )
printf("%d",test(i) ? 1:0 );
puts("");
return 0;
}
实现方法说明:
i >> SHIFT:将i向右移动5位,相当于将i除以32位。因为一个int是32位,所以结果表示i在第几个int数组成员中;
举例说明:如果i是34,则结果是1,也就是从0开始的第1个int数组成员。
1 << (i & MASK):使用掩码留下i的低5位再左移动1位,相当于除以32所得的余数再左移动1位。因为第一是0,所以结果都需要左移动1位。结果中1所在的位表示i在该int数组成员的第几位上。
接着上例继续说明,如果i是34,则i & MASK是2,二进制表示是10,再向左移动1位,得到100,也就反映出此时从0开始的第2位是1。