/*
* @Descripttion:
* @version:
* @Author: Zcz
* @Date: 2024-04-19 13:52:13
* @LastEditors: Zcz
* @LastEditTime: 2024-04-19 15:34:31
*/
#include <stdio.h>
#include <stdint.h>
// 定义结构体,用于记录位偏移量和传入的32位整数数组
typedef struct {
const uint32_t *data; // 传入的32位整数数组
int num_elements; // 数组中元素的数量
int array_index; // 当前数组元素索引
int bit_position; // 当前位偏移量
} BitExtractor;
// 从结构体中提取位并转换为64位无符号整数
uint64_t extract_bits(BitExtractor *extractor, int num_bits) {
uint64_t extracted_value = 0;
int bits_remaining = num_bits;
while (bits_remaining > 0 && extractor->array_index < extractor->num_elements) {
// 获取当前数组元素的值
uint32_t value = extractor->data[extractor->array_index];
// 计算当前要处理的位在32位整数中的位置
int current_bit = 31 - extractor->bit_position;
// 取出当前位的值(0或1)
uint64_t bit_value = (value >> current_bit) & 0x1;
// 将取出的位添加到提取结果的对应位置
extracted_value |= (bit_value << (bits_remaining - 1));
// 更新位偏移量
(extractor->bit_position)++;
// 如果当前数组元素的位偏移量达到了32位,则移动到下一个数组元素
if (extractor->bit_position >= 32) {
extractor->array_index++;
extractor->bit_position = 0; // 重置位偏移量
}
// 更新剩余位数
bits_remaining--;
}
return extracted_value;
}
uint64_t extract_64bits(BitExtractor *extractor, int num_bits)
{
return extract_bits(extractor, num_bits);
}
uint32_t extract_32bits(BitExtractor *extractor, int num_bits)
{
return (uint32_t)extract_bits(extractor, num_bits);
}
uint16_t extract_16bits(BitExtractor *extractor, int num_bits)
{
return (uint16_t)extract_bits(extractor, num_bits);
}
uint8_t extract_8bits(BitExtractor *extractor, int num_bits)
{
return (uint8_t)extract_bits(extractor, num_bits);
}
int main() {
// 示例 uint32_t 数组(假设包含待提取的数据)
const uint32_t data[] = {0x12345678, 0x9ABCDEF0, 0x56152358, 0x56152358, 0x56152358 , 0x54641616, 0x46518481 , 0x46fdf481}; // 示例输入值
int num_elements = sizeof(data) / sizeof(data[0]);
// 创建 BitExtractor 结构体
BitExtractor extractor = {
.data = data,
.num_elements = num_elements,
.array_index = 0,
.bit_position = 0
};
// 从输入值中按照从最高位开始的顺序提取位并转换为64位无符号整数
uint64_t extracted_bits1 = extract_bits(&extractor, 3);
uint64_t extracted_bits2 = extract_bits(&extractor, 7);
uint64_t extracted_bits3 = extract_bits(&extractor, 15);
uint64_t extracted_bits4 = extract_bits(&extractor, 7);
uint64_t extracted_bits5 = extract_bits(&extractor, 16);
uint64_t extracted_bits6 = extract_bits(&extractor, 48);
uint64_t extracted_bits7 = extract_bits(&extractor, 64);
uint64_t extracted_bits8 = extract_bits(&extractor, 0);
uint64_t extracted_bits9 = extract_bits(&extractor, 1);
uint64_t extracted_bits10 = extract_bits(&extractor, 3);
uint64_t extracted_bits11 = extract_bits(&extractor, 7);
uint64_t extracted_bits12 = extract_bits(&extractor, 6);
uint64_t extracted_bits13 = extract_bits(&extractor, 6);
uint64_t extracted_bits14 = extract_bits(&extractor, 8);
uint64_t extracted_bits15 = extract_bits(&extractor, 1);
uint64_t extracted_bits16 = extract_bits(&extractor, 29);
uint64_t extracted_bits17 = extract_bits(&extractor, 25);
uint64_t extracted_bits18 = extract_bits(&extractor, 10);
// 输出提取的64位无符号整数值
printf("Extracted bits as uint64_t: %llu\n", extracted_bits1);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits2);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits3);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits4);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits5);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits6);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits7);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits8);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits9);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits10);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits11);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits12);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits13);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits14);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits15);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits16);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits17);
printf("Extracted bits as uint64_t: %llu\n", extracted_bits18);
return 0;
}
newfedff
于 2024-04-18 21:01:24 首次发布