二进制串的逆转
二进制串的逆转
Problem Description
0000 0000 0000 0001,逆转之后为1000 0000 0000 0000
Input
Output
Sample Input
1 100
Sample Output
-2147483648 637534208
分析:
题目的描述还是很清楚的,就是把一个数的32位的二进制字符串倒过来。例如一个数的二进制字符串是1001 1010 1011 1100 1101 1100 0011 1010 带过来就是 0101 1100 0011 1011 0011 1101 0101 1001,我使用的办法就将四个二进制位倒过来,然后送到相应的地方,比如说,最后的1010,我就先把他变成 0101, 然后送到最高位。倒数第二个的0011,我就变成1100,然后送到第二个位置。那么我就是要8个数,去保存这8个 4位 二进制的数既可以了。然后最后判断是不是负数还是正数,分别输出。其中需要注意的是,保存的八个 4位 二进制的数,也是分别保存在相应的位置上面。例如 0101 1100 0011 1011 0011 1101 0101 1001。
str[7] = 0000 0000 0000 0000 0000 0000 0000 1001
str[6] = 0000 0000 0000 0000 0000 0000 0101 0000
str[5] = 0000 0000 0000 0000 0000 1101 0000 0000
str[4] = 0000 0000 0000 0000 0011 0000 0000 0000
str[3] = 0000 0000 0000 1011 0000 0000 0000 0000
str[2] = 0000 0000 0011 0000 0000 0000 0000 0000
str[1] = 0000 1100 0000 0000 0000 0000 0000 0000
str[0] = 0101 0000 0000 0000 0000 0000 0000 0000
如果最后结果是正数,就把上面的全部加起来,如果是负数则是str[7] - str[6]-str[5]-...-str[0],负数的补码性质。
1 #include<stdio.h> 2 3 void fun (int *p) { 4 int a, b, c, d, i; 5 a = *p & 1; 6 a = a << 3; 7 b = *p & 2; 8 b = b << 1; 9 c = *p & 4; 10 c = c >> 1; 11 d = *p & 8; 12 d = d >> 3; 13 *p = a + b + c + d; 14 } 15 16 int main () { 17 18 int n, a, b, i, c; 19 int str[8]; 20 while (scanf("%d",&n) != EOF) { 21 a = 15; b = 0; c = 28; 22 for (i = 0; i < 8; i++) { 23 str[i] = n & a; 24 str[i] = str[i] >> b; 25 fun (&str[i]); 26 str[i] = str[i] << c; 27 b = b + 4; 28 c = c - 4; 29 a = a << 4; 30 } 31 if (n % 2 == 0) { 32 for (i = 0; i < 7; i++) 33 str[7] = str[7] + str[i]; 34 printf("%d\n", str[7]); 35 } else { 36 for(i = 0; i < 7; i++) 37 str[7] = str[7] - str[i]; 38 printf("%d\n",str[7]); 39 } 40 41 } 42 return 0; 43 }