C语言中Ascii字符到二进制转换的说明

C语言中Ascii字符到二进制转换的说明,c,bit-manipulation,ascii,C,Bit Manipulation,Ascii,有人能详细解释一下下面的Char-to-Binary函数在C中是如何工作的吗 特别是位移位和逻辑and如何在迭代中工作 #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 <

有人能详细解释一下下面的Char-to-Binary函数在C中是如何工作的吗

特别是位移位和逻辑and如何在迭代中工作

#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);
    }
}
迭代将是:

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
使用以下代码:

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

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

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

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

假设您的二进制数字是
01010101

For循环迭代包括:

  • 01010101&10000000=00000000
    结果是
    0
    ,您打印
    0
  • 01010101&01000000=01000000
    结果是
    >0
    ,您打印
    1
  • 01010101&00100000=00000000
    结果是
    0
    ,您打印
    0
  • 等等

  • 打印完所有内容后,
    01010101

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

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

    假设您的二进制数字是
    01010101

    For循环迭代包括:

  • 01010101&10000000=00000000
    结果是
    0
    ,您打印
    0
  • 01010101&01000000=01000000
    结果是
    >0
    ,您打印
    1
  • 01010101&00100000=00000000
    结果是
    0
    ,您打印
    0
  • 等等

  • 打印您得到的所有内容后,
    01010101

    类型字符可以作为类型
    有符号字符
    或类型
    无符号字符

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

    也就是说,函数顺序地将字符的位从最高有效位移动到第一个位置。二进制运算符
    &
    将结果值中除第一位以外的所有其他位设置为零。因此,此表达式
    (无符号字符)c>>i&1
    提取给定字符中的目标位。

    类型字符可以作为类型
    有符号字符
    或类型
    无符号字符

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

    也就是说,函数顺序地将字符的位从最高有效位移动到第一个位置。二进制运算符
    &
    将结果值中除第一位以外的所有其他位设置为零。因此,这个表达式
    (unsigned char)c>>i&1
    提取给定字符中的目标位。

    不是答案,但理解c运算符的优先级肯定有帮助。第二个示例将
    c
    位索引
    位移到右侧,然后用
    1
    进行and。如果在该位置设置了位,这将导致
    1
    ,否则
    0
    。第一个将
    1
    i
    位向左移位,并使用
    c
    进行and,如果设置了
    i
    位置的位,则会导致非零值,否则为零。如果要编辑问题以包括该更新,您可能希望显示另一个循环的迭代,因为操作的值不同。在这一点上,它可能应该得到自己的答案在
    char
    或有符号整数类型上执行任何形式的位操作都是危险的做法。跟随教程学习如何编写错误代码不是很好吗?@Robben_Ford_Fan_boy您可以通过一些修改来取消“教程”代码的速度:
    void printCharAsBinary(uint8_t c){for(size_t i=0;这不是答案,但理解C运算符的优先级肯定会有所帮助。第二个示例将
    C
    位索引
    位向右移动,然后用
    1
    进行and。如果在该位置设置了位,则将导致
    1
    否则
    0
    。第一个示例将
    1
    i
    左边的位和带有
    c
    的ands如果位置
    i
    的位被设置为非零值,否则为零。如果要编辑问题以包含该更新,可能需要显示另一个循环的迭代,因为所操作的值不同。在这一点上,它可能值得它自己的答案在
    char
    或有符号整数类型上执行任何形式的位操作都是危险的做法。遵循教你如何编写错误代码的教程不是很好吗?@Robben_Ford_Fan_boy你可以用