我希望能在我的代碼上得到一個快速的幫助。我需要在我的函式做其他事情之前將char c轉換為二進制。然而,我得到了錯誤的資訊,說我使用了itoa,并且不確定如何嘗試這一部分的功能。
主函式是:
char *alpha = "abcde"。
unsigned char bits[8] 。
for (int pos=0; pos<5; pos )
{
printf( "%c", alpha[pos] ) 。
char2bits( alpha[pos], bits )。
}
就我目前掌握的情況而言,該函式是:
void char2bits( char c。unsigned char bits[8] )/span>{
for(int i = 0; i < 5; i ){
itoa(c, (bits)[i], 2) 。
}
/ ....
}
uj5u.com熱心網友回復:
一個可能的實作char2bits():
void char2bits(char c, unsigned char bits[8]) {
for (size_t i = 0; i < 8; i =1) {
bits[i] = (c >> (7 - i)) & 1;
}
}
int main(void) {
char c = 3;
unsigned char bits[8] 。
char2bits(c, bits)。
//現在`bits`等于{0, 0, 0, 0, 0, 1, 1}。
for (size_t i = 0; i < 8; i = 1) {
printf("%hhu
", bits[i])。)
}
return 0;
}
uj5u.com熱心網友回復:
首先,當你想處理位元組時,你應該使用無符號char或uint8_t。
這個函式將一個位元組變成一個可列印的字串(你可以使用printf或puts與 "位元 "陣列):
void char2bits(unsigned char c。unsigned char bits[8]) {
int shift, i;
for(shift = 7, i = 0; i < 8; --shift, i)
bits[i] = ((c >> shift) & 0x1) '0'。
}
發生了什么?
隨著c = 250 = 1111 1010
首先,你的位元表是空的,所以。 bits = ""
步驟i = 0:
(c >> shift) = 右移7 = 0000 0001
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) '0' = ((c >> shift) & 0x1) 48 = 48 1 = 49 = '1' ascii
所以位元="1";
步驟 i = 1:
(c >> shift) = 右移6 = 0000 0011
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) '0' = ((c >> shift) & 0x1) 48 = 48 1 = 49 = '1' in ascii
所以位元="11";
步驟i = 2:
(c >> shift) = 右移5 = 0000 0111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) '0' = ((c >> shift) & 0x1) 48 = 48 1 = 49 = '1' ascii
所以位元="111";
步驟i = 3:
(c >> shift) = 右移4 = 0000 1111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) '0' = ((c >> shift) & 0x1) 48 = 48 1 = 49 = '1' in ascii
所以位元="1111";
步驟i = 4:
(c >>shift) = 右移3 = 0001 1111
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) '0' = ((c >> shift) & 0x1) 48 = 48 1 = 49 = '1' in ascii
所以位元="111111";
步驟i = 5:
(c >> shift) = 右移2 = 0011 1110
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0000
((c >> shift) & 0x1) '0' = ((c >> shift) & 0x1) 48 = 0 48 = 48 = '0' in ascii
所以位元="111110";
步驟i = 6:
(c >> shift) = 右移1 = 0111 1101
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0001
((c >> shift) & 0x1) '0' = ((c >> shift) & 0x1) 48 = 1 48 = 49 = '1' in ascii
所以位元="111101";
步驟i = 7:
(c >> shift) = 右移0 = 1111 1010
(c >> shift) & 0x1 = 只保留最后一位 = 0000 0000
((c >> shift) & 0x1) '0' = ((c >> shift) & 0x1) 48 = 0 48 = 48 = '0' in ascii
所以位元="1111010";
我希望這能幫助你。
<uj5u.com熱心網友回復:
下面是我的做法
void char2bits( char c。unsigned char bits[8] )
{
for( int i = 0; i < 8; i)
{
//為位`i`創建一個掩碼。
int mask = 1 << i。
//將`bits`陣列的相應成員設定為0或1。
//取決于相關位的值。
bits[i] = (c & mask) ? '1'/span> : '0'/span>;
}
}
希望這很清楚。
基本技術是使用位法和&運算子從輸入字符中剝離出一個位。隨著回圈的執行,該掩碼將有1、2、4、8等值。我將&的結果送入三元運算子test ? a : b,以在輸出陣列中存盤一個 "1 "或一個 "0 "字符。
這就相當于寫出了
if(c & mask)
bits[i] = '1'/span>;
else
bits[i] = '0'。
注意,我在所有8個可能的位上進行了迭代,而不是你的代碼中的5個。還要注意的是,在輸出中,bits[0]將持有輸入字符c的最小有效位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/322469.html
標籤:
