翻转

时间:2015-11-23 04:41:18

标签: bit-manipulation

我对以下问题感到困惑。 翻转位表示将位从0更改为1,反之亦然。操作OP(i)将导致二进制数字的翻转,如下所示。 执行OP(i)将导致从开始i> 0

开始每个第i位的翻转

给出n位数作为输入,并且一个接一个地施加OP(j)和OP(k)。目标是指定应用这两个操作后保持相同的位数。

当我应用逻辑层(n / i)+ floor(n / j)-2时,它没有给我预期的解决方案。 例: 二进制数:10110101101             I:3             记者:4 预期产量:6 但是我得到了3.请告诉我如何解决这个问题。 我也检查了这个解决方案Filpping bits in binary number。但他们也提到了相同的逻辑。

2 个答案:

答案 0 :(得分:2)

让寄存器包含N位,位1到N. (1)OP(i)表示每个第i位都被翻转。那是i,2 * i,3 * i ...的位     被翻转。翻转的总位数= floor(N / i)
(2)OP(j)表示每个第i位被翻转。那是j,2 * j,3 * j ......的位     被翻转。翻转总位数= floor(N / j)
(3)设L = LCM(i,j)。因此,L,2 * L,3 * L,......处的位将是
    翻转两次,意味着比特不变是下限(N / L)

因此,在OP(i)和OP(j)之后,改变的总比特将是
楼层(N / i)+楼层(N / j) - 2 *楼层(N / L)
未改变的位数= N - 层数(N / i) - 层数(N / j)+ 2 *层数(N / L)

对于N = 11,i = 4,j = 3,L = LCM(3,4)= 12,
未改变的位数= 11 - 11/4 - 11/3 + 11/12 = 11 - 2 - 3 + 0 = 6

答案 1 :(得分:1)

 public static int nochange_bits(String input1,int i1,int i2)
    {
        try{
        int len=input1.length();
        if(i1<1 || i2<1){
            return -1;
        }else if(i1>len && i2>len){
            return len;
        }else if(i1==i2){
            return len;
        }else{
            return (int)(len-Math.floor(len/i1)-Math.floor(len/i2)+2*Math.floor(len/(Math.abs(i1*i2) / GCF(i1, i2))));
        }
        }catch(Exception e){
            e.printStackTrace();
            return -1;
        }
    }

    public static int GCF(int a, int b) {
    if (b == 0) return a;
    else return (GCF (b, a % b));
}

a)首先,我们检查输入的所有条件和无效性 b)然后我们计算LCM以获得输出

说明:它类似于翻转开关问题, 首先我们切换i1位 第二轮我们切换i2位

在此过程中,具有LCM(i1,i2)的位被反转。

所以我们将lcm添加回总数