C-将三个8位字符处理成24位块,再处理成四个6位块

C-将三个8位字符处理成24位块,再处理成四个6位块,c,bit-manipulation,bit,C,Bit Manipulation,Bit,给定三个字符输入a、b、c,如何将这三个8位值转换为一个24位值。接下来,如何将24位的值转换为四个独立的6位值 例如: a=ascii'a'=0x41=0100 0001 b=ascii'b'=0x42=0100 0010 c=ascii'c'=0x43=0100 0011 合计=01000001010000110011 六比特1=010000 六比特2=010100 六比特3=001001 六比特4=000011 现在对于实现,我考虑将所有字符组合成一个int,因为它可以容纳32位,然后将容

给定三个字符输入a、b、c,如何将这三个8位值转换为一个24位值。接下来,如何将24位的值转换为四个独立的6位值

例如:

a=ascii'a'=0x41=0100 0001

b=ascii'b'=0x42=0100 0010

c=ascii'c'=0x43=0100 0011

合计=01000001010000110011

六比特1=010000

六比特2=010100

六比特3=001001

六比特4=000011


现在对于实现,我考虑将所有字符组合成一个int,因为它可以容纳32位,然后将容纳“A”、“B”和“C”的字符向左移位到int上,但我不确定向左移位多少。至于获取四个六位值,我不知道该怎么做,也不知道应该使用什么数据类型。感谢您的帮助

实现类似于以下内容

unsigned int a = 'A'; // = 0x41 = 0100 0001

unsigned int b = 'B'; // = 0x42 = 0100 0010

unsigned int c = 'C'; // = 0x43 = 0100 0011

unsigned int allTogether = 0 // 010000010100001001000011

unsigned int sixBit1 = 0; // 010000
unsigned int sixBit2 = 0; // 010100
unsigned int sixBit3 = 0; // 001001
unsigned int sixBit4 = 0; // 000011

allTogether = (a<<16)||(b<<8)||c;

sizbit1 = (allTogether&0x00FC0000)>>18;
sizbit2 = (allTogether&0x0003F000)>>12;
sizbit3 = (allTogether&0x00000FC0)>>6;
sizbit4 = (allTogether&0x0000003F);
试试这个:

#include <stdint.h>

int main (int argc, char const *argv[])
{
    char c1, c2, c3;

    c1 = 'A';
    c2 = 'B';
    c3 = 'C';

    uint32_t allTogether = c1 << 16 | c2 << 8 | c3;
    uint32_t sixBit1 = (allTogether & (0b111111 << 18)) >> 18;
    uint32_t sixBit2 = (allTogether & (0b111111 << 12)) >> 12;
    uint32_t sixBit3 = (allTogether & (0b111111 << 6)) >> 6;
    uint32_t sixBit4 = (allTogether & 0b111111);
    return 0;
}

请注意,0b111111是GCC和LLVM支持的二进制文本,可能还有一些其他编译器支持,但并非所有编译器都支持。如果编译器不支持它,请替换为127。

通常,所有整数类型的大小取决于平台。在某些系统上,int可以是16位。如果您想要一个固定大小的整数,请将uint32\u t.与位字段的并集一起使用。您无法确定位字段的布局方式。根据C标准6.7.2.1,实现可分配任何足够大的可寻址存储单元,以容纳位字段。如果仍有足够的空间,结构中紧跟在另一位字段之后的位字段应打包到同一单元的相邻位中。如果空间不足,则将定义是否将不适合的位字段放入下一个单元或与相邻单元重叠。单元内位字段的分配顺序由实现定义,即从高阶到低阶或从低阶到高阶。可寻址存储单元的对齐方式未指定。oops,this:allTogether=a当您被否决时,请留下一条注释,说明您被否决的原因。二进制常量是一个gcc扩展,由此代码引发3个警告。未使用的参数argc和argv[]还会引发3个警告。未使用的变量sixBitx会引发另外3个警告。因此,代码是不可移植的,不能干净地编译。