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