【问题标题】:Converting a char to binary bits, i.e.: 'a' to binary equivalent将 char 转换为二进制位,即:'a' 转换为等效二进制
【发布时间】:2021-11-14 03:50:12
【问题描述】:

我希望能快速掌握我的代码。在我的函数执行其他操作之前,我需要将 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);
    }

    // ...
}

【问题讨论】:

  • 改用位移位。
  • unsigned char c 的位 X 被发现为 (c &gt;&gt; X) &amp; 1。
  • 抱歉之前没用过位移
  • @IgorMassarski 你能提供一个输入和相对预期输出的例子吗?
  • @LucaPolito 它需要在给出之后调用一个函数并执行此操作,从字符 c 的位 0 到 7 并将位值存储在数组位中。

标签: c function binary bit binary-data


【解决方案1】:

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;
}

【讨论】:

  • 非常感谢大家的帮助
【解决方案2】:

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

这个函数把一个字节变成一个可打印的字符串(你可以使用 printf 或 puts 和 "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

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

步骤 i = 0:

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

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

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = '1' in ascii

所以位 = "1";

步骤 i = 1:

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

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

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = '1' in ascii

所以位 = "11";

步骤 i = 2:

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

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

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = '1' in ascii

所以位 = "111";

步骤 i = 3:

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

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

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = '1' in ascii

所以位 = "1111";

步骤 i = 4:

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

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

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 48 + 1 = 49 = '1' in ascii

所以位 = "11111";

步骤 i = 5:

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

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

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 0 + 48 = 48 = '0' in ascii

所以位 = "111110";

步骤 i = 6:

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

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

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 1 + 48 = 49 = '1' in ascii

所以位 = "1111101";

步骤 i = 7:

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

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

((c >> shift) & 0x1) + '0' = ((c >> shift) & 0x1) + 48 = 0 + 48 = 48 = '0' in ascii

所以位 = "11111010";

希望对您有所帮助。

【讨论】:

  • 非常感谢您向我解释
【解决方案3】:

我会这样做

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';
    }
}

希望这很清楚。

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

这相当于写出来

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

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

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 2011-02-10
    • 2011-06-21
    • 2022-11-07
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多