如何将二进制数拆分为 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 位大小的二进制文件(获取 0100010101000001、)并向它们添加两个二进制文件(添加 10000001 => 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语言 很急

如何将 int 转换为十六进制数并将其打印为 c 中的 3 位数字? [复制]

C语言 判断一个数的二进制数第7位是不是为1

用Python 3.1.3 写几个进制转换的程序

php编程:将26位字母进制转换为10进制数字,如何做?

c语言中如何将10进制的浮点数转化为16进制数