我尝试执行一种算法,该算法将计算矩阵中有多少个元素用给定键的最后 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.
限制条件:
最佳答案
按位操作的C / C++运算符优先级为“ buggy ”。
在C / C++中
aux & mask == mask
被解析为
aux & (mask == mask)
您需要改写
(aux & mask) == mask
因为否则
aux
每次都会以和1无关的方式结束,而与掩码大小无关。关于c++ - 用于计算数组中有多少值与给定键互补的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34549922/