如何将二进制数拆分为 6 位二进制数并在 C 中添加其他位?
Posted
技术标签:
【中文标题】如何将二进制数拆分为 6 位二进制数并在 C 中添加其他位?【英文标题】:How to split binary number into 6-bits binary numbers and add other bits in C? 【发布时间】:2022-01-15 03:18:40 【问题描述】:我正在尝试将二进制文件(例如 0100 0101 0100 0001
)拆分为 6 位大小的二进制文件(获取 0100
、010101
、000001
、)并向它们添加两个二进制文件(添加 10
到000001
=> 10000001
)。
如何在 C 中做到这一点?
【问题讨论】:
使用>>
多次右移,然后使用例如& 0b111111
屏蔽掉每个部分不需要的位,
【参考方案1】:
您可以结合使用位掩码和位移位来提取源的部分内容,并在提取后修改值。
要从源中隔离最低有效(“最低”)6 位,请使用bitwise AND (&
) operator 用二进制 00111111(十六进制 3F)对其进行屏蔽;添加所需的“10”位作为最重要(“最高”)2 位,使用bitwise (inclusive) OR (|
) operator 用二进制 10000000(十六进制 80)进行掩码。
对于无符号源整数,可以依次执行上述操作,每次提取后右移6位(使用>>
或>>=
运算符),直到所有必填字段被提取出来。
将您的源作为unsigned short
,将您所需的目标作为3 个unsigned char
的数组,以下说明了该过程:
#include <stdio.h>
void splitbyte(unsigned short src, unsigned char dst[3])
for (int i = 0; i < 3; ++i)
dst[i] = (src & 0x3F) | 0x80; // Extract the low 6 bits and mask in the top "10! bits
src >>= 6; // Shift right by 6, so next loop extracts next field
int main(void)
unsigned short src = 0x4541; // 0100 0101 0100 0001
unsigned char dst[3];
splitbyte(src, dst);
// You could printf in a loop but I wanted to comment each value ...
printf("%02X\n", (unsigned)(dst[0])); // 81 = 10 000001
printf("%02X\n", (unsigned)(dst[1])); // 95 = 10 010101
printf("%02X\n", (unsigned)(dst[2])); // 84 = 10 000100
return 0;
【讨论】:
【参考方案2】:您正在寻找bitwise operators
几个例子,在二进制字面量的开头强制使用0b
:
0b0100010101000001 & 0b111111;// = 0b000001
0b0100010101000001 & (0b111111 << 6);// = 0b010101
0b0100010101000001 & (0b111111 << 12);// = 0b010001
0b101010 | 0b10 << 6;// = 0b10101010
注意:根据您使用的编译器,将二进制文字写为0bxxxx
可能无效,因为它不是标准的。您可能需要转换为十进制或十六进制 (0xAF
)。见this post。
【讨论】:
以上是关于如何将二进制数拆分为 6 位二进制数并在 C 中添加其他位?的主要内容,如果未能解决你的问题,请参考以下文章
3. 从键盘上输入一个八进制数,利用指针将其转换为十进制数并输出 C语言 很急