簡體   English   中英

在C中將Ascii Char轉換為Binary的解釋

[英]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

對於循環迭代為:

  1. 01010101 & 10000000 = 00000000結果為0 ,則打印0
  2. 01010101 & 01000000 = 01000000結果為> 0 ,則打印1
  3. 01010101 & 00100000 = 00000000結果為0 ,則打印0
  4. 等等。

打印所有內容后,您將得到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM