C/C++中位运算在实际中的应用

位运算在C/C++语言中经常用到,记录一下位运算在实际中常用的类型。

用作bool数组

了解位图之前应该先了解位运算的基本操作的组合;

  • 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
  • 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
  • 常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
  • 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
  • 取反操作 ~
  • 设置相应的位
     1.计算下标 i
     2.将相应的位设置为 1 
         代码:
         unsigned int mask = 1;
         mask = mask << i;
         flag = flag | mask;

         简洁写法:
         flag |= (0x1 << i);(从右到左计数 31 <- 0) 
         flag |= (0x80000000 >> i);(从左到右 0 -> 31)
  • 清除相应的位
     1.计算下标 i
     2.将相应的位设置位 0
         代码:
         unsigned int mask = 1;
         mask = mask << i;
         mask = ~mask;
         flag = flag & mask;
         简介写法:
         flag &= ~(0x1 << i)(从右到左)
         flag &= ~(0x80000000 >> i);(从左到右)

  • 获取相应的位,即判断某位的值为 1 还是 0;
       1. 计算需要判定的索引为 i;
       2. 判断 flag & (1 << i)(右到左) 的值,左到右则位 flag & (0x80000000 >> i)
           为 0 :则索引 i 对应的位为 0;
           非 0: 则索引 i 对应的位为 1;
           例子:
           //第 10 位为 0
           if((a & (1 << 10)) == 0){
               cout << " 第十位为 0 " << endl;
           }
           //第 31 为 1
           if((a & (1 << 31)) != 0){
               cout << " 第 31 位为 1 " << endl;
           }

i)代替布尔类型的数组
按位与操作最常用的就是用整数来代替 vector<bool>类型的数组,如下的代码:

#include <iostream>  
#include<vector>
#include<string>

#include <stdio.h>
#include <string.h>

using namespace std;
extern int errno ;

//封装一个bool类型的数组,采用位图来存储信息
class vector_bool{
public:
    vector_bool(unsigned int size, bool init = false)
    :size_(size), init_(init)
    {
        arr = (unsigned int*)malloc(sizeof(unsigned int)*(size_/32 + 1));
        if(!arr){
            perror("内存分配异常!");
        }
        unsigned int init_val = init_ ? full_true : full_false;
        for(int i = 0; i <= (size_ / 32 + 1); i++){
            arr[i] = init_val;
        }
    }
    ~vector_bool(){
        if(arr){
            free(arr);
        }
    }
    //将特定索引 index 的值设置位 val
    void set_val_of(int index, bool val){
        unsigned int arr_index = index / 32;
        unsigned int bit_index = index % 32;
        if(index < size_ && index >=0){
            if(val == true){
                arr[arr_index] |= (mask >> bit_index);
            }else{
                arr[arr_index] &= ~(mask >> bit_index);
            }
        }else{
            fprintf(stderr, "索引越界!\n");
            exit(-1);
        }
    }
    //获取相应的位的值
    bool get_val_of(int index){
        if(index < size_ && index >=0){
            return (arr[index / 32] & (mask >> (index % 32))) == 0 ? false : true;
        }else{
            fprintf(stderr, "索引越界!\n");
            exit(-1);
        }
    }

    void print(){
       for(int i = 0 ;i < (size_/32 + 1) ; i++){
           Binary(i);
       }
       cout << endl;
    }
private:
    unsigned int size_;//数组的大小
    bool init_;//数组的初始状态
    unsigned int *arr;
    enum{
        full_true = 0xffffffff,
        full_false = 0x0,
        mask = 0x80000000
    };
	//将一个整数打印为二进制形式
    void Binary(unsigned int n)  
    {
        int count[32] = {0};
        int index = 31;
        while (n != 0)
        {
            count[index--] = n%2;
            n = n /2 ;
        }
        for(int i = 0; i < 32; ++i){
           cout<<count[i];
        }
    }
};

位运算实现的API

// 负数返回 1,正数返回0
int Sign(int v) {
	return (v >> (sizeof(int) * CHAR_BIT - 1));
}
//负数返回 -1, 正数返回 1
int Sign(int v) {
	return (+1 | (v >> (sizeof(int) * CHAR_BIT - 1)));
}
//负数返回0,正数返回1
int Sign(int v) {
 return (1 ^ ((unsigned int)v >> (sizeof(int) * CHAR_BIT - 1)));
}

bool isOppositeSign(int v1, int v2) {
	return ((v1 ^ v2) < 0)
}

unsigned int abs(int v) {
	int const mask = v >> sizeof(int) * CHAR_BIT - 1;
	return (v + mask) ^ mask;
}

int min(int x, int y) {
	return y ^ ((x ^ y) & -(x < y));
}

int max(int x, int y) {
	return x ^ ((x ^ y) & -(x < y));
}

bool isPowOf2() {
	v && !(v & (v - 1));
} 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C/C++语言参考(C/C++ Language Reference)是一本非常重要的编程参考手册,它通常以CHM(Compiled HTML Help)格式呈现。CHM是一种微软开发的专用电子帮助文件格式,结合了HTML页面、索引和内容搜索等特性,方便用户查阅。 C/C++语言参考CHM提供了C/C++编程语言的详细描述、语法规则和标准函数库的函数说明等内容。通过这本参考手册,程序员可以深入了解C/C++语言的各种特性和用法,从而更加高效地进行软件开发。 在C/C++语言参考CHM,通常包括以下部分: 1. 语言概述:介绍C/C++语言的起源、特点和发展历程等内容,帮助读者了解和掌握C/C++的基本概念。 2. 语法规则:详细描述了C/C++语言的语法规则,包括关键字、数据类型、运算符、控制语句等基本语法要素,帮助读者正确地编写C/C++程序。 3. 标准函数库:列举了C/C++语言标准函数库的各个函数及其用法,包括字符串操作、数学运算、文件操作等功能,方便程序员直接使用这些函数进行开发。 4. 示例代码:提供了一些常用的示例代码,展示了C/C++语言各种特性的实际应用,方便读者学习和参考。 C/C++语言参考CHM对于学习和使用C/C++编程语言的人来说是一本非常宝贵的工具,它可以帮助程序员快速查找语法和函数相关的信息,提高开发效率。无论是初学者还是有经验的开发者,都可以通过C/C++语言参考CHM来深入理解C/C++编程语言,并利用其强大的功能进行软件开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值