【问题标题】:How to split binary number into 6-bits binary numbers and add other bits in C?如何将二进制数拆分为 6 位二进制数并在 C 中添加其他位?
【发布时间】:2022-01-15 03:18:40
【问题描述】:

我正在尝试将二进制文件(例如 0100 0101 0100 0001)拆分为 6 位大小的二进制文件(获取 0100010101000001、)并向它们添加两个二进制文件(添加 10000001 => 10000001)。

如何在 C 中做到这一点?

【问题讨论】:

  • 使用>> 多次右移,然后使用例如& 0b111111 屏蔽掉每个部分不需要的位,

标签: c binary byte bit


【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2019-07-02
      • 2015-07-23
      • 1970-01-01
      相关资源
      最近更新 更多