2011-03-03 73 views
4

給定二進制的71744474十進制,它是0100010001101011101111011010我試圖從這個十進制中提取的是從低位開始的每七位。七位中的每一位都表示可打印的ASCII字符,只能有7位。總共我拉出四個字符。第一個字符是1011010,它是ASCII碼爲Z。下一個字符是w依此類推。我想有一種方法可以掩蓋我關心一些事情的方式。屏蔽c中的不需要的位

+0

在辦理位。你應該以十六進制值爲例。所以它會非常容易理解。 – kapilddit 2012-10-16 14:20:11

回答

7

使用位運算符:

0100010001101011101111011010 & 0000000000000000000001111111 = 1011010 

要獲得第二個字符,做

0100010001101011101111011010 & 0000000000000011111110000000 

等..沿着這個線路

+1

但是,你如何在for循環中做到這一點,並保持掩碼移動來揭示新的位,並且你怎樣在每個時間掩蓋不同數量的位? – MarcusJ 2015-05-25 00:02:44

3

的東西應該足夠了:

#include <stdio.h> 

int main (void) { 
    unsigned int value = 71184592; // Secret key :-) 

    for (unsigned int shift = 0; shift < 28; shift += 7) 
     printf ("%c", (value >> shift) & 0x7f); 
    putchar ('\n'); 

    return 0; 
} 

It使用位移將所需的特定位轉換爲值的最低有效位7位,並使用位掩碼清除所有其他位。

如果您運行的代碼,你會看到它可以很愉快地提取單個ASCII字符中的每一個七位組:

Pax! 
2
int myN = 71744474; 
int mask = 0x7F7F7F7F; // 7F is 0111 1111, or 7 on bits. 

int result = myN & mask; 

char myBytes[4]; 
myBytes[0] = (char)((result  & 0x000000FF); 
myBytes[1] = (char)((result >> 8) & 0x000000FF); 
myBytes[2] = (char)((result >> 16) & 0x000000FF); 
myBytes[3] = (char)((result >> 24) & 0x000000FF); 


// Now, examine myBytes[0-3], and I think they'll be what you want. 
+1

我不認爲這是正確的 - 構成每個字符的七位實際上是壓縮在一起的,而您的代碼假設每個字符都使用8位,而您只是將每個字符的最高位置零。 – paxdiablo 2011-03-03 06:09:19

+0

啊....我誤解了,但paxdiablo更好地解釋了它。我會解決我的答案,但正確的答案已經被接受。 – abelenky 2011-03-03 16:21:53

0
#include <stdio.h> 

int main() 
{ 
    int a = 71744474; 
    a = a&0xFFFFFFF; // 1111111 1111111 1111111 1111111 
    while (a>0) { 
     char b = a&0x7f; // 1111111 
     printf("%c", b); 
     a = a>>7; 
    } 
}