xor值最大-c#求解-英雄会在线编程题目

   本来没打算写这道题的解法的,但是有朋友问怎么做,那我今天就把这道题的解法写出来。

xor值最大
  • 发布公司:
  • 有 效 期:
  • 赛 区:
  • CSDN
  • 2014-02-262014-03-28
  • 北京
  • 难 度 等 级:
  • 答 题 时 长:
  • 编程语言要求:
  • 120分钟
  • C C++ Java C#                
题目详情
                给定整数区间[a,b],从闭区间[a,b]中选择两个数,使得它们的异或值最大。 0<=a<=b<2^63           

 

       首先要明白异或的概念,其次计算机在做异或运算的时候,就是0,1的比较。所以,第一步,我们要考虑a,b的二进制。

具体思路就是:

1、首先求出a,b的二进制位数。为什么要求出二进制位数?原因很简单,直观啊,而且异或运算的最大结果不会超过b的二进制位数。距离来说:

如果a为1011,b为100110,那么他们异或的值位数一定不会超过b的位数,即6位,而且最大也就是111111,。

2、知道了异或值可能的最大位数,那么就容易计算最大值是多少?很显然是位数个1,但是,这又受到a的影响,a对它的影响,可以看出,当a的位数小于b的位数时,那么最大值就是b位数个1,如果a的位数和b的位数相同,那么从高位开始比较,直到a的某一位和b的同一位置不想同,那么,很明显,这就相当于吧前面的截掉,邱泽两个新的数的异或最大值,而且,根据1,可以直接得到最大异或值。

 

  在思路2中,为什么是这样的,是这样分析的:

假设b的位数为6,那么b一定大于等于100000,如果a和不的位数不相同,那么一定能找到一个数c:11111,位数为5,个1,这个c一定小于b,一定大于等于a,那么就可以得到最大异或值了。

位数相同,那么就向后找。分析同上。

 

代码比较简单:

int al = 0;
            int bl = 0;
            long tmpa = a;
            long tmpb = b;
            if (a == 0)
            {
                al = 1;
            }
            else
            {
                while (tmpa > 0)
                {
                    al++;
                    tmpa = tmpa >> 1;
                }
            }
            if (tmpb == 0)
            {
                bl = 1;
            }
            else
            {
                while (tmpb > 0)
                {
                    bl++;
                    tmpb = tmpb >> 1;
                }
            }

            long max = 0L;
            if (al != bl)
            {
                max = (1L << bl) - 1;
            }
            else
            {
                for (int i = bl - 1; i >= 0; i--)
                {
                    tmpb = (b >> i) % 2;
                    tmpa = (a >> i) % 2;
                    if (tmpb == 1)
                    {
                        if (tmpb != tmpa)
                        {
                            max = (1L << (i+1) )- 1;
                            break;
                        }
                    }
                }
            }

           
            return max;

ok,到此结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值