用C语言数组实现位操作(位数组)

本文主要讲述用C语言数组实现二进制位的几种操作。

所谓的位数组,主要是为了有效地利用内存空间而设计的一种存储数据的方式。在这种结构中一个整数在内存中用一位(1 bit)表示。这里所谓的表示就是如果整数存在,相应的二进制位就为1,否则为0。

主要思想:我们知道一个 char 类型的数据在内存中占用 1Byte(即 8 bit),如果我们用二进制位在内存中的顺序来代表整数则可以存储更多的信息。

这样的话,一个 char 类型可以存储 8个整数。即 第1个二进制位代表整数0,第二个二进制位代表整数1,以此类推。

那更大的整数如何表示呢?

我们可以用 char数组 来解决这个问题。假设 a是一个 char 数组的话,整数8就可以用 a[1] 的第一个二进制位表示了。

这里的关键就是 一个char型能表示8个整数。

下面我实现一种利用 char 数组实现的二进制数组。主要包括以下三个方法:

(1)将一个整数添加到二进制数组中  add_to_bitarray(char *, int)

该方法的主要作用是将二进制数组中表示该整数的位置为1。首先我们得找到该整数位于 char 数组的第几个元组中,这里利用该整数除以8即可(代码中除以8用右移三位实现),例如整数25位于25/8 = 3 余 1,表明该整数是用char 数组的第三个元组的第二位表示,在该元组的第几位可以利用该整数的后三位表示,即 25 & 0x7 = 1。将相应位置为1.可以先将整数1左移相应位数,然后与二进制数组进行或操作即可。(详细实现见代码)

(2)判断一个整数是否在二进制数组中  is_in_bitarray(char *, int)

先找到该整数在二进制数组中的位置,然后判断该位是否为1,若是则表示该整数位于二进制数组中,反之不在数组中。

(3)删除二进制数组中的一个整数   clear_bitarray(char *, int)

思路相同,先找到该整数在二进制数组中的位置,然后将该位置为0即可。(如何确定位置通方法(1),具体实现见代码)。

/****************************************************
	* author: yym from XMU. 
	* function: using bitwise logical operations
	*   (such as and,or and shift) to implement bit vectors
	****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SHIFT 3
#define MASK 0x7

char *init_bitarray(int);
void add_to_bitarray(char *, int);
int is_in_bitarray(char *, int);
void clear_bitarray(char *, int);
void test(char *);

int main(){
	char *arr;
	
	arr = init_bitarray(100);
	add_to_bitarray(arr, 90);
	test(arr);
	clear_bitarray(arr, 90);
	test(arr);

	return 0;
}

char *init_bitarray(int size){
	char *tmp;

	tmp = (char*)malloc(size / 8 + 1);
	memset(tmp, 0, (size / 8 + 1));	//initial to 0

	return tmp;
}

void add_to_bitarray(char *bitarr, int num){
	bitarr[num >> SHIFT] |= (1 << (num & MASK));
}

int is_in_bitarray(char *bitarr, int num){
	return bitarr[num >> SHIFT] & (1 << (num & MASK));
}

void clear_bitarray(char *bitarr, int num){
	bitarr[num >> SHIFT] &= ~(1 << (num & MASK));
}

void test(char *bitarr){

	if(is_in_bitarray(bitarr, 30) != 0)
		printf("30 in\n");
	else
		printf("30 not in\n");
	if(is_in_bitarray(bitarr, 90) != 0)
		printf("90 in\n");
	else
		printf("90 not in\n");
}


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,生成64随机数并存储在一个数组中通常需要用到`<stdlib.h>`库中的`rand()`函数和一些位操作来组合生成所需的随机精度。由于`rand()`返回的是32整数,我们需要将多个调用的结果组合成一个64数。以下是一个简单的示例: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ARRAY_SIZE 8 // 假设我们想要一个包含8个元素的64数组 // 将两个32随机数连接为64 unsigned long long combine_two_32_bits(unsigned int high, unsigned int low) { return ((unsigned long long)high << 32) | low; } int main() { srand(time(0)); // 设置随机种子,确保每次程序运行得到不同的结果 unsigned int high_part[ARRAY_SIZE / sizeof(unsigned int)]; unsigned int low_part[ARRAY_SIZE / sizeof(unsigned int)]; for (int i = 0; i < ARRAY_SIZE; i++) { // 生成两组32随机数 high_part[i] = rand(); low_part[i] = rand(); // 结合两部分生成64数,并存入数组 unsigned long long combined_num = combine_two_32_bits(high_part[i], low_part[i]); unsigned char combined_array; // 预留足够的空间存储64数值(8字节) memcpy(combined_array, &combined_num, sizeof(combined_num)); printf("Array element %d: ", i); for (size_t j = 0; j < sizeof(combined_array); j++) { printf("%02X", combined_array[j]); // 输出十六进制表示 } printf("\n"); } return 0; } ``` 请注意,这个方法仅适用于32系统,因为64系统中`unsigned int`可能已经是64。在64系统上,直接使用`unsigned long long`类型即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值