#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);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;
}
关于bit位的操作
最新推荐文章于 2024-06-13 14:08:04 发布