位运算

Problem description

One can determine the Gray code by its number using a very simple function: G(x) = x xor (x div 2), where xor stands for bitwise exclusive OR (bitwise modulo 2 addition), and div means integer division. It is interesting to note that function G(x) is invertible, which means it is always possible to uniquely restore x given the value of G(x). Write a program to restore number x from the given value of G(x).

Input

The input file contains an integer number y, the value of G(x).
0<=x,y<=10^9

Output

The output file should contain a single integer x such that G(x) = y.

Sample Input
15
1723
Sample Output
10
1234

题意简单明了,不赘述。数据范围大,所以不可以用暴力。

有一点,位运算是可交换,可逆的。可以以此进行思考。

弱弱的很想说,自己测试了几组数据和A过的答案比了一下,都是对的,但是不知道为什么wa…… 

终于知道哪里错了……处理的时候最后一位忘了加上去… 

#include <stdio.h>
#include <string.h>
int main()
{
    __int64 n;
    while(scanf("%I64d",&n)!=EOF)
    {
        int i,j,k;
        int init[100],x[100];
        __int64 p,q,r;
        p=n;i=0;
        memset(init,0,sizeof(init));
        memset(x,0,sizeof(x));
        while(p)
        {
            init[i++]=p&1;//printf("*%d\n",init[i-1]);
            p=p>>1;
        }
        x[i-1]=0;q=0;
        for(j=i-2;j>=0;j--)
        {
            x[j]=init[j+1]^x[j+1];
            q+=x[j];
            q=q<<1;
        }
           <span style="font-family: Arial, Helvetica, sans-serif;">q+=x[0]^init[0];</span>
        printf("%I64d\n",q);
    }
    return 0;
}

‘&’通常拿来取数的末位。‘|’这个是或。刚开始把这两个弄混了。

啊还有,原先自己想的数据都能过,但是队友随手测了一个就不行……所以……想数据的时候,一定要有点技巧,如果普通的数据可以过,就多往边界想想,比如说0,1,这样的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值