关于bit位的操作

#include<iostream>
#include<stdint.h>
#include<stdlib.h>
#include<assert.h>
using namespace std;

class ActivityUtils
{
    public:
        static uint32_t rand_bit_off_index(uint32_t status, uint32_t n, uint32_t m);
        static uint32_t rand_bit_on_index(uint32_t status, uint32_t n, uint32_t m);
        static uint32_t set_bit_on(uint32_t value, uint32_t pos);
        static uint32_t set_bit_off(uint32_t value, uint32_t pos);
        static uint32_t test_bit_on(uint32_t value, uint32_t pos);
        static uint32_t get_out_id_by_prob(uint32_t arr[], uint32_t len);
};
//在n-m位随机一个bit位为0的位,返回该bit位的的位置(第几位),没有返回0
uint32_t ActivityUtils::rand_bit_off_index(uint32_t status, uint32_t n, uint32_t m)
{
    uint32_t result = n - 1;
    uint32_t vec[32];
    uint32_t size = 0;

    for (uint32_t i = n - 1; i < m; ++i) {
        if (!(status & (1 << i))) {
            vec[size++] = i + 1;
        }
    }

    if (size > 0) {
        result = vec[rand() % size];
    }

    return result - n + 1;
}

//在n-m位随机一个bit位为的位,返回该bit位的的位置(第几位),没有返回0
uint32_t ActivityUtils::rand_bit_on_index(uint32_t status, uint32_t n, uint32_t m)
{
    uint32_t result = n - 1;
    uint32_t vec[32];
    uint32_t size = 0;

    for (uint32_t i = n - 1; i < m; ++i) {
        if (status & (1 << i)) {
            vec[size++] = i + 1;
        }
    }

    if (size > 0) {
        result = vec[rand() % size];
    }

    return result - n + 1;
}

//把value的pos位置为1

uint32_t ActivityUtils::set_bit_on(uint32_t value, uint32_t pos)
{
    assert(pos > 0);

扫描二维码关注公众号,回复: 9906882 查看本文章

    return value | (1u << (pos - 1));
}

//把value的pos位置为0

uint32_t ActivityUtils::set_bit_off(uint32_t value, uint32_t pos)
{
    assert(pos > 0);
    
    return value & ~(1u << (pos - 1));
}

//检查value的第pos位是1还是0,1返回1,0返回0

uint32_t ActivityUtils::test_bit_on(uint32_t value, uint32_t pos)
{
    assert(pos > 0);

    return value & (1u << (pos - 1));
}

/*

arr[]概率数组

len数组长度

根据概率数组的概率随机概率的下标

*/

uint32_t ActivityUtils::get_out_id_by_prob(uint32_t arr[], uint32_t len) 
{
    uint32_t sum = 0;

    for (uint32_t i = 0; i < len; ++i) {
        sum = sum + arr[i];
    }

    if (sum == 0) {
        return 0;
    }

    uint32_t rand_value = rand() % sum;
    
    sum = 0;
    
    for (uint8_t i = 0; i < len; ++i) {
        sum = sum + arr[i];

        if (rand_value < sum) {
            return i + 1;    
        }
    }

    return 0;
}

int main() {

    uint32_t status = 0;


    uint32_t value = ActivityUtils::rand_bit_off_index(status, 1, 8);
  

     cout<<value<<endl;
    
    status = ActivityUtils::set_bit_on(status, value);


    cout<<status<<endl;

    bool test = ActivityUtils::test_bit_on(status, 8);


    cout<<test<<endl;


    return 0;
}

发布了25 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39771637/article/details/104479794