C语言中Ascii Char转换为二进制的解释

时间:2017-03-02 14:09:25

标签: c bit-manipulation ascii

有人可以详细解释下面的Char到Binary函数如何在C中工作吗?

具体如何移位和逻辑并在迭代上工作

#include <stdio.h>
#include <limits.h>
void printCharAsBinary(char c) {
    int i;
    for(i = CHAR_BIT; i >= 0; i--){
        printf("%d", ( unsigned int )( ( c & (1 << i) ) ? 1 : 0) );
    }
}

void printCharAsBinaryVer2(char c){
    int bit_index;
    for (bit_index = CHAR_BIT; bit_index >= 0; --bit_index)
    {
        int bit = ( unsigned int ) (c >> bit_index) & 1;
        printf("%d", bit);
    }
}

如果有帮助,你可以在这里看到它们: http://code.geeksforgeeks.org/zC22WO

根据答案进行更新:

F小数为70

70在二进制文件中是01000110

使用以下代码:

#include <stdio.h>
#include <limits.h>
void printCharAsBinary(char c) {
    int i;
    for(i = CHAR_BIT; i >= 0; i--){
        printf("%d", ( unsigned int )( ( c & (1 << i) ) ? 1 : 0) );
    }
}

迭代将是:

01000110 & 10000000 = 00000000  RESULT is 0   so PRINT 0
01000110 & 01000000 = 01000000  RESULT is > 0 so PRINT 1
01000110 & 00100000 = 00000000  RESULT is 0   so PRINT 0
01000110 & 00010000 = 00000000  RESULT is 0   so PRINT 0
01000110 & 00001000 = 00000000  RESULT is 0   so PRINT 0
01000110 & 00000100 = 00000100  RESULT is > 0 so PRINT 1
01000110 & 00000010 = 00000000  RESULT is > 0 so PRINT 1
01000110 & 00000001 = 00000000  RESULT is 0   so PRINT 0

使用以下代码:

void printCharAsBinaryVer2(char c){
    int bit_index;
    for (bit_index = CHAR_BIT; bit_index >= 0; --bit_index)
    {
        int bit = ( unsigned int ) (c >> bit_index) & 1;
        printf("%d", bit);
    }
}

00000000 & 00000001 = 00000000  RESULT is 0   so PRINT 0
00000001 & 00000001 = 00000001  RESULT is > 0 so PRINT 1
00000010 & 00000001 = 00000000  RESULT is 0   so PRINT 0
00000100 & 00000001 = 00000000  RESULT is 0   so PRINT 0
00001000 & 00000001 = 00000000  RESULT is 0   so PRINT 0
00010001 & 00000001 = 00000001  RESULT is > 0 so PRINT 1
00100011 & 00000001 = 00000001  RESULT is > 0 so PRINT 1
01000110 & 00000001 = 00000000  RESULT is 0   so PRINT 0

2 个答案:

答案 0 :(得分:2)

Char具有8位二进制表示。 您将字符表示中的每个位打印为1或0,如下所示:

你进行for循环,然后使用计数器向左移动逻辑,然后按位AND,检查是否设置了位。如果是,则打印1,否则打印0。

让我们说你的二进制数是01010101

对于循环迭代是:

  1. 01010101 & 10000000 = 00000000结果为0,您打印0
  2. 01010101 & 01000000 = 01000000结果为> 0,您打印1
  3. 01010101 & 00100000 = 00000000结果为0,您打印0
  4. 等等。
  5. 打印完所有内容后01010101

答案 1 :(得分:1)

char类型可以表现为signed char类型或类型unsigned char

根据C标准(6.5.7按位移位算子)

  

4 ...如果E1具有带符号类型和非负值,则E1×2E2为   在结果类型中可表示,那么这就是结果值;   否则,行为未定。

     

5 ...如果E1有签名类型和负值,结果   价值是实施定义的

因此,在这两个函数中,最好将字符强制转换为unsigned char类型。

该功能看起来像是在这个演示程序中显示的

#include <stdio.h>
#include <limits.h>

void printCharAsBinary( char c )
{
    for ( int i = CHAR_BIT; i-- != 0; )
    {
        printf( "%u", ( unsigned char )c >> i & 1 );
    }
}

int main(void) 
{
    for ( char c = 'A'; c <= 'Z'; ++c )
    {
        printf( "%c: ", c );
        printCharAsBinary( c );
        putchar( '\n' );
    }       

    return 0;
}

它的输出是

A: 01000001
B: 01000010
C: 01000011
D: 01000100
E: 01000101
F: 01000110
G: 01000111
H: 01001000
I: 01001001
J: 01001010
K: 01001011
L: 01001100
M: 01001101
N: 01001110
O: 01001111
P: 01010000
Q: 01010001
R: 01010010
S: 01010011
T: 01010100
U: 01010101
V: 01010110
W: 01010111
X: 01011000
Y: 01011001
Z: 01011010

即,该函数将字符的位从最高有效位开始顺序移位到第一位置。二元运算符&将除结果值的第一个之外的所有其他位设置为零。因此,此表达式( unsigned char )c >> i & 1提取给定字符中的目标位。