我尝试执行一种算法,该算法将计算矩阵中有多少个元素用给定键的最后 S 位的相同位数补充其最后 S 位。

假设S等于3,要验证的数字是12,密钥是3。
以二进制表示形式12 =(00001100)和3 =(00000011)。如果将xor应用于这两个值,我们将得到15(00001111)。但是我们仅考虑最后的S(3)位,并且由于它们都等于1,因此对数字进行了补码。
如果我们有相同的数字12,但键5(00000101),则xor的结果将返回9(00001001),但最后的S(3)位不全为1,因此不进行补码。

我尝试在c++中实现该算法,尽管我一遍遍地遍历了它,但似乎找不到逻辑错误。我问您,因为此代码是在我处理的问题中使用的,并且自动对其进行评估的网站并未授予该子问题所有的要点。

int complement()
{
    //map is a globally declared matrix
    //k is the key, also global
    //S is the number of bits we take into account, also global
    int i, j, nr=0, mask, aux;
    mask = (1<<S)-1;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            aux = map[i][j]^k;
            if( aux & mask == mask)
            {
                map[i][j]=0;    //overwritten as 0 meaning it is good
                nr++;
            }
            else map[i][j]=-1;  //overwritten as -1
        }
    return nr;     //how many numbers could be complemented
}

For the matrix:
15 1278 3  1278 1278 1
16 17   18 19   254  20
21 25   26 254  254  254
27 28   29 3    2    254
2  254  4  254  254  254

The program returns:
-1  0 -1  0 0 -1
 0 -1  0 -1 0  0
-1 -1  0  0 0  0
-1  0 -1 -1 0  0
 0  0  0  0 0  0

and nr = 20.

限制条件:
  • S
  • 所有值和键

    最佳答案

    按位操作的C / C++运算符优先级为“ buggy ”。

    在C / C++中

    aux & mask == mask
    

    被解析为
    aux & (mask == mask)
    

    您需要改写
    (aux & mask) == mask
    

    因为否则aux每次都会以和1无关的方式结束,而与掩码大小无关。

    关于c++ - 用于计算数组中有多少值与给定键互补的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34549922/

  • 10-11 15:10