C++位掩码72位变量并切断前导和尾随零 - 请帮忙

C++ Bitmask 72bit variable and cut off leading and trailing zero's - Help please

本文关键字:72位 掩码 变量 C++      更新时间:2023-10-16

我有一个72位无符号变量,我只对24位感兴趣。该变量被划分为34位/24位/14位。位掩码工作得很好,但我想将前面的34个零和后面的14个零转储,并将结果存储到一个新变量中。

我为对大多数人来说似乎很容易的问题道歉,我只是编程的新手,已经陷入了非常非常深刻的境地。我正在处理的项目细节是将Anaren无线电模块与STM32F4Discovery Board进行通信。我在STM板上启动了外围设备,并在两个设备之间运行SPI传输功能。我正在设置接收功能,以获取来自无线电模块的结果并隔离这些特定的位。然后我相信会有越来越多的问题,但现在这是我头疼的问题。

我衷心感谢大家的时间和耐心:)真诚地Hearny

编辑:1谢谢大家-我们的信息=再也不会了。这两个变量都是在程序开始时定义的,我认为它们与我的问题无关。在&运算结果会给我我感兴趣的24位和我不想要的14个尾随零。我怎么能放下它们?

代码:

    anaren_packet=SPI1_send(0x00);  //send dummy packet to receive data
    packet_lap = anaren_packet & 3FFFFFC000; // Bitmask for middle-ish 24bits

这里唯一的问题是72位比int64_t大,所以你必须考虑一下操作,不能只使用琐碎的移位和掩码。

但您可能需要使用一个位字段:

typedef union my_int72 {
    struct my_int72 {
        unsigned garbage_lsb : 14;
        unsigned actual_content : 24;
        unsigned garbage_msb : 34;
    } triple;
    uint8_t array[9];
} my_int72_t;

在这里,my_int72_t::triplemy_int72_t::array具有相同的大小并且位于相同的存储器上。要访问数据,只需阅读var_name.triple.actual_content

另一个优点是,您可以为三重数据提供实际有用的名称。缺点是,通常为位字段生成的代码不是最佳的。


编辑:你是一个字节一个字节地读,你必须读9个字节,对吧?

那就做:

 uint32_t result = 0;
 request_bytes();
 read_byte();                                    // byte 0
 result |= (uint8_t) read_byte() >>  6;          // byte 1 (2 bits read)
 result |= (uint8_t) read_byte() <<  2;          // byte 2 (10 bits read)
 result |= (uint8_t) read_byte() << 10;          // byte 3 (18 bits read)
 result |= ((uint8_t) read_byte() << 18) & 0x3F; // byte 4 (24 bits read)
 read_byte();                                    // byte 5
 read_byte();                                    // byte 6
 read_byte();                                    // byte 7
 read_byte();                                    // byte 8