以下是以下算法:
int encryption(int a, int b) {
short int c, c2;
uint8_t d;
c = a ^ b;
c2 = c;
d = 0;
while(c) {
c &= c - 1;
d++;
}
return d;
}
如何找到该函数中应该发送哪个变量a和b来决定d的输出值?
换句话说,如果我想要d = 11,我该怎样扭转算法呢?
答案 0 :(得分:1)
d
只是c
中“1”位的数量,请参阅http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan。
因此,您只需找到a
和b
,使其按位XOR值恰好为11位,例如a = 0
和b = 2047
。
(这不是加密。这是一种非常弱的单向散列。加密必须提供一种方法来取回原始值(解密)。)
答案 1 :(得分:1)
此:
while(c) {
c &= c - 1;
d++;
}
计算c
中的1位数。例如,如果c = 10110
,则d为3。
此:
c = a ^ b;
在a
和b
之间exclusive or。这意味着在a
和b
中共享相同位置的所有1位将为零,并且a
和b
中具有不同值的所有位置将成为1.例如:
101110 ^
011010
========
110100
基本上,算法在a ^ b
中找到1位的数量。要强制它输出特定值,只需a = 0
然后b = number with d 1-bits
。
要获得d
1位的数字,请考虑b = (2 to the power of d) - 1
。
因此,如果您需要d = 11
,那么a = 0
和b = (2 to the power of 11) - 1 = 2048 - 1 = 2047
。
要以编程方式有效地计算2到某个功率,请使用以下公式:
2 to the power of k == 1 << k
所以,基本上:encryption(a, b) == d if a = 0 and b = (1 << d) - 1
。
答案 2 :(得分:-1)
我看到它在XOR b中计算SET位?
好的,那么让我们说a == 0,b == 4095。