掩盖c中不需要的位

给定二进制的十进制71744474 ,它是0100010001101011101111011010我想从这个十进制中提取的是从低位开始的每七位。 七位中的每一位都表示可打印的ASCII字符,其只能有7位。 我总共拿出四个字符。 第一个字符是1011010 ,它是ASCII的Z 下一个字符是w ,依此类推。 我在想有一种方法来掩盖我关心的一些方面。

使用按位运算符:

 0100010001101011101111011010 & 0000000000000000000001111111 = 1011010 

要获得第二个角色,请执行

 0100010001101011101111011010 & 0000000000000011111110000000 

等等..

根据这一点,应该足够了:

 #include  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; } 

它使用位移将所需的特定位获取到值的最低有效位7位,并使用位屏蔽来清除所有其他位。

如果你运行该代码,你会发现它可以很愉快地提取每个七位组的单个ASCII字符:

 Pax! 
 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. 
 #include  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; } }