实现位向量 1.6.2

本文介绍了一种使用位逻辑运算(如与、或、移位)实现位向量的方法,并通过具体代码示例展示了如何排序0到N-1范围内的无重复整数。文章详细解释了关键操作如设置位、清除位以及检测位的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值