使用位逻辑运算实现位向量

如何使用位逻辑运算实现位向量呢?

起初,看到这个问题,我也有点懵逼,位逻辑运算还是了解一点,可是位向量这个名词还是有点陌生。

所以,想要解决这个问题,就要明确两个概念:位逻辑运算和位向量。


1.位运算:&(按位与)、|(按位或)、>>和<<(移位)、^(异或)、~(取反)、>>>(c中无,java里有)。

位运算实现位向量主要用前三个位运算。


2.位向量:顾名思义,位向量就是用一些二进制位组成的向量。在很多的情况下,我们可以用一个二进制表示一个对象。但是,我们不能直接用一个变量名直接表示一个位(单独一个位组成的数据类型是不存在的),于是,我们就可以考虑将多个位组成基本的数据类型,然后通过对这个基本的数据类型进行操作,从而达到对位进行操作的目的。同时,为了方便,把由位组成的基本数据类型组成数组,这样就可以对一定范围的为位数据集合进行操作了。


3.如何真正的操作位向量:对位向量各位的操作不能直接通过名称去访问, 只能通过位置去操作,也就是我们要操作第几位数。在我们看来,位是由0-n连续的, 实际上,我们是用基本数据类型数组来存储的,因为这些位存在于不同的数组元素之中,分布于不同数组的不同位置当中。假设我们以int类型作为 基本数据类型,则一个int类型可以存储32个位(c++中)。则对于一个特定的位(pos),我们要先求出它处于哪个数组之中(pos/32),然后求出该位在这个数组中具体的位置(pos%32)。


4.对于位的具体操作有三个:对特定位置1,对特定位清0,判断特定位。


5.想要对位进行操作,还要理解下面几个表示:

①m/(2^n) = m>>n;

②m%(2^n) = ( m & 2^(n)-1 );

③将int型变量a的第k位置1: a = ( a | (1 << k) );

④将int型变量a的第k位清0: a = ( a & ~(1 <<k) ).


6.实现代码

#include<stdio.h>

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F//2^5-1
#define N 10000000
int a[1 + N/BITSPERWORD];

//将第i位置1
void set( int i)
{
    a[ i >> SHIFT] = ( a[ i >> SHIFT] | (1 << (i & MASK)));
}

//将第i位清0
void clr( int i)
{
    a[ i >> SHIFT] = ( a[ i >> SHIFT] & ~(1 << (i & MASK)));
}

//判断对应位
int test( int i)
{
    return a[ i >> SHIFT] & ( 1 << (i & MASK));
}

int main()
{
    set(1001);
    if( test(1001))
    {
        printf("true %d\n",test(1001));
    }
    else
        printf("false\n");

    clr(1001);
    if( test(1001))
        printf("true\n");
    else
        printf("false\n");


    return 0;
}


7.******





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值