newfedff

/*
 * @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;
}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值