[英]Explanation of conversion of Ascii Char to Binary in C
有人可以詳細解釋以下Char to 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
Char具有8位二進制表示形式。 您正在像這樣在字符表示中將每個位打印為1或0:
您進行for循環,並使用計數器將邏輯左移,然后使用按位與並檢查是否設置了位。 如果是,則打印1,否則打印0。
假設您的二進制數字是01010101
對於循環迭代為:
01010101 & 10000000 = 00000000
結果為0
,則打印0
01010101 & 01000000 = 01000000
結果為> 0
,則打印1
01010101 & 00100000 = 00000000
結果為0
,則打印0
打印所有內容后,您將得到01010101
。
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
提取給定字符中的目標位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.