zoukankan      html  css  js  c++  java
  • 1.6.2如何使用位逻辑运算(例如与、或、位移)来实现位向量?

    /*如何使用位逻辑运算(例如与、或、位移)来实现位向量?
    指的是实现位向量的设置、清零、探测三个操作。
    问题理解:
    错误:用一个int表示一位
    应该是操作bit,但是长度可能不一定是8或者32的倍数,因此使用连续的多个bit存储,但是还是要操作bit
    错误:使用%作为选定位置
    不能使用%,k除以32,可以使用右移的方式
    求模?k mod 32 ?
    2012.1.6
    */

    #include <stdio.h>
    #include <memory.h>

    #define MAXA 1000
    #define LENG_INT 32
    #define SHIFT 5   //求除结果,除以32
    #define MASK 0x1f  //求模,模32

    int bitVector[1 + MAXA / LENG_INT];

    int isLegial(int k)
    {
        if(k <0 || k> MAXA)
            return 0;
        return 1;
    }

    void initA()
    {
        memset(bitVector, 0, sizeof(bitVector)/LENG_INT);
    }

    void set(int k)
    {
        bitVector[k>>SHIFT] |= 1<<(k&MASK);
    }
    void clear(int k)
    {
        bitVector[k>>SHIFT] &= ~(1<<(k&MASK));
    }
    int test(int k)
    {
        return bitVector[k>>SHIFT] & (1<<(k&MASK));
    }
    void show()
    {
        int i;
        for(i = 0; i < (1 + MAXA / LENG_INT); ++i)
        {
            printf("%d", bitVector[i]);
        }
        printf("\n");
    }
    int main()
    {
        initA();
        show();   
        set(2);
        show();
        printf("test result: %d\n", test(2));

        clear(2);
        show();
        printf("test result: %d\n", test(2));
        return 0;
    }

  • 相关阅读:
    程序员必备工具之Cmder
    Markdown简明教程
    几种黑灰名词解释
    windows下 mysql启动错误1067进程意外终止
    Mac OS 安装redis
    java里的这些
    maven 两条命令建立 web项目
    判断StringBuilder是否为空
    map与list的交集、补集操作
    关于创业
  • 原文地址:https://www.cnblogs.com/growup/p/2315195.html
Copyright © 2011-2022 走看看