将 char 转换为二进制位,即:'a' 转换为二进制等价物

Converting a char to binary bits, i.e.: 'a' to binary equivalent

我希望能快速掌握我的代码。在我的函数做其他事情之前,我需要将 char c 转换为二进制。但是,我收到的错误提示是我使用 itoa 错误,我不确定还有什么方法可以尝试这部分功能。

主要功能是:

char *alpha = "abcde";
unsigned char bits[8];

for (int pos=0;pos<5;pos++)
{
    printf( "%c ", alpha[pos] );
    char2bits( alpha[pos], bits );
}

到目前为止,我所拥有的功能是:

void char2bits( char c, unsigned char bits[8] ){
    for(int i = 0; i < 5; i++){
        itoa(c, (bits)[i], 2);
    }

    // ...
}

char2bits()的可能实现:

void char2bits(char c, unsigned char bits[8]) {
  for (size_t i = 0; i < 8; i += 1) {
    bits[i] = (c >> (7 - i)) & 1;
  }
}

int main(void) {
  char c = 3;
  unsigned char bits[8];

  char2bits(c, bits);
  // now `bits` is equal to {0, 0, 0, 0, 0, 0, 1, 1}

  for (size_t i = 0; i < 8; i += 1) {
    printf("%hhu\n", bits[i]);
  }

  return 0;
}

首先,当你想使用字节时,你应该使用 unsigned char 或 uint8_t。

此函数将一个字节转换为 printable 字符串(您可以使用 printf 或将“bits”数组放入):

void char2bits(unsigned char c, unsigned char bits[8]) {
    int shift, i;
    for(shift = 7, i = 0; i < 8; --shift, ++i)
        bits[i] = ((c >> shift) & 0x1) + '0';
}

发生什么事了?

c = 250 = 1111 1010

首先你的位 table 是空的,所以: 位 = ""

步骤 i = 0:

(c >> shift) = 右移 7 = 0000 0001

(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'

所以位 = "1";

步骤 i = 1:

(c >> shift) = 右移 6 = 0000 0011

(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'

所以位 = "11";

步骤 i = 2:

(c >> shift) = 右移 5 = 0000 0111

(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'

所以位 = "111";

步骤 i = 3:

(c >> shift) = 右移 4 = 0000 1111

(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'

所以位 = "1111";

步骤 i = 4:

(c >> shift) = 右移 3 = 0001 1111

(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = ascii 格式的 '1'

所以位 = "11111";

步骤 i = 5:

(c >> shift) = 右移 2 = 0011 1110

(c >> shift) & 0x1 = 只保留最后一位 = 0000 0000

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 0 + 48 = 48 = ascii 格式的 '0'

所以位 = "111110";

步骤 i = 6:

(c >> shift) = 右移 1 = 0111 1101

(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 1 + 48 = 49 = ascii 格式的 '1'

所以位 = "1111101";

步骤 i = 7:

(c >> shift) = 右移 0 = 1111 1010

(c >> shift) & 0x1 = 只保留最后一位 = 0000 0000

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 0 + 48 = 48 = ascii 格式的 '0'

所以位 = "11111010";

希望对你有所帮助

这是我的做法

void char2bits( char c, unsigned char bits[8] )
{
    for( int i = 0; i < 8; ++i)
    {
        // create a mask for bit `i`
        int mask = 1 << i;

        // set the corresponding member of the `bits` array to 0 or 1
        // depending on the value of the relevant bit
        bits[i] = (c & mask) ? '1' : '0';
    }
}

希望这是清楚的。

基本技术是使用按位和 & 运算符从输入字符中去除单个位。当循环执行时,掩码将具有值 1、2、4、8 等。我将 & 的结果输入三元运算符 test ? a : b 以在输出数组中存储“1”或“0”字符。

这相当于写出来

if(c & mask)
    bits[i] = '1';
else
    bits[i] = '0';

请注意,我已经迭代了所有 8 个可能的位,而不是您的代码使用的 5 个。另请注意,在输出中,bits[0] 将保留输入字符 c.

最低有效位