本帖最后由 yes2 于 2023-12-6 22:01 编辑
[C++] 纯文本查看 复制代码 uint64_t data[11] = { 0x2882d802120e, 0x28529a05954, 0x486088c03, 0xc0fb3b55754, 0xc2b9b7f8651, 0xae83fb054c, 0x29abf6ddcb15, 0x10e261fc807, 0x2a82fe86d707, 0xe0cb79a5706, 0x330560890d06 };
uint32_t flag[11] = { 0 };
for (int i = 0; i < 11; ++i) {
uint64_t a = data[i] >> 15; // 低15位不参与异或,先丢弃[0-14];最高2位应该也没有用到[62-63]
uint64_t b = a >> 15; // 再次右移15位作为异或子
uint64_t c = b ^ a; // 异或 [15-46] ^ [30-61]
uint64_t d = c & 0xfffffffc; // 保留[17-46]
flag[i] = d | (data[i] & 0x3); // 合并[0-1]
}
所以应该是64位数值按位[0-63]来,取位[17-46] ^ [32-61]的结果作为flag的[2-31]位,[0-1]照抄 |