二进制串的逆转

二进制串的逆转

 

Problem Description

将一个32位整数的二进制表示串的值逆转。如1的二进制表示为:
0000 0000 0000 0001,逆转之后为1000 0000 0000 0000

Input

每行一个32位的整数

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 }
View Code

 

转载于:https://www.cnblogs.com/gznb/p/11213179.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值