C++位掩码72位变量并切断前导和尾随零 - 请帮忙
C++ Bitmask 72bit variable and cut off leading and trailing zero's - Help please
我有一个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::triple
和my_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
相关文章:
- 位移操作和位掩码未检测到重复字符
- 生成前缀位掩码
- 如何从__m64值的 lsb 创建 8 位掩码?
- 如何对无符号长 int 进行位掩码?
- 如何在C++中优雅地处理位掩码
- 将uint64_t位掩码转换为 std::布尔数组
- 优化从子位掩码生成父位掩码
- 基于模式创建位掩码作为 constexpr
- C++中的运行时位复制(位掩码)
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 位掩码,用于确定数字是正数还是负数 c++
- C++ 位掩码:代码块的说明
- 使用位掩码生成排列
- 复制位集的复杂性有多大?它和位掩码一样吗?
- 位掩码结果不一致
- 是否有与“ memchr”相似的函数,可以将每个炭与位掩码匹配,而不是确切的平等
- C++位掩码/条件分支优化
- 将位掩码类型与零进行比较的正确方法
- 位掩码:通过集合方法设置对象的不同状态
- C++位掩码72位变量并切断前导和尾随零 - 请帮忙