有人可以详细解释下面的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
答案 0 :(得分:2)
Char具有8位二进制表示。 您将字符表示中的每个位打印为1或0,如下所示:
你进行for循环,然后使用计数器向左移动逻辑,然后按位AND,检查是否设置了位。如果是,则打印1,否则打印0。
让我们说你的二进制数是01010101
对于循环迭代是:
01010101 & 10000000 = 00000000
结果为0
,您打印0
01010101 & 01000000 = 01000000
结果为> 0
,您打印1
01010101 & 00100000 = 00000000
结果为0
,您打印0
打印完所有内容后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
提取给定字符中的目标位。