C 比特攻击与模运算

C 比特攻击与模运算,c,bit-manipulation,low-level,C,Bit Manipulation,Low Level,在阅读此文时: 我想到了这句话: 最后一步,即模数除以2^10-1,具有 将每组10位合并在一起的效果(从位置0-9, 10-19,20-29,…)输入64位值 (这是关于反转数字中的位) 所以我做了一些计算: reverted = (input * 0x0202020202ULL & 0x010884422010ULL) % 1023; b = 74 : 01001010 b * 0x0202020

在阅读此文时:

我想到了这句话:

最后一步,即模数除以2^10-1,具有 将每组10位合并在一起的效果(从位置0-9, 10-19,20-29,…)输入64位值

(这是关于反转数字中的位)

所以我做了一些计算:

reverted = (input * 0x0202020202ULL & 0x010884422010ULL) % 1023;

b = 74          :                                 01001010
b 
 * 0x0202020202 :       1000000010000000100000001000000010
   = 9494949494 :01001010010010100100101001001010010010100
  & 10884422010 :10000100010000100010000100010000000010000 
    = 84000010  :         10000100000000000000000000010000
  % 1023        :                               1111111111
    = 82        :                                 01010010

现在,唯一有点不清楚的部分是1023(2^10-1)的大数模打包并给我倒过来的位。。。关于位运算和模运算之间的关系,我没有找到任何好的文档(除了
x%2^n==x&(2^n-1))
),因此,如果有人能解释一下这一点,可能会非常有成效。

模运算本身并没有给出反转位,它只是一个装箱操作

第一行:单词扩展 b*0x020202=0100101001001010010010100100101001001010010010100

乘法运算具有卷积特性,这意味着它多次复制输入变量(这里是5,因为它是8位字)

第一行:反转位 这是黑客最棘手的部分。您必须记住,我们正在处理一个8位字:
b=abcdefgh
,其中[a-h]为1或0

b  * 0x0202020202 = abcdefghabcdefghabcdefghabcdefghabcdefgha
    & 10884422010 = a0000f000b0000g000c0000h000d00000000e0000
最后一行:单词binning 模有一个特殊的性质:
10≡ 1(模块9)
so
100≡ 10*10 ≡ 10*1(模块9)≡ 1(模块9)

更一般地说,对于基本
b
b≡ 1(模块b-1)
so对于所有编号
a≡ 总和(a_k*b^k)≡ 总和(a_k)(mod b-1)

在本例中,
base=1024
(10位)因此


模运算不会“反转”位,它只是将4个字节“打包”成一个。@RagingCallion你说得对,我这边的措辞很糟糕……仅供参考,在定点体系结构的CPU上,除法运算(如模运算)非常昂贵。现在,您将问题标记为
低级
,因此我认为它可能与您的情况相关。如果您正在为这种处理器编写代码,那么您应该尽量避免使用
%
/
(如我所说,仅供参考)。。。此外,您可能还需要查看(不涉及部门操作)。虽然它显示了一个32位操作数的示例,但我相信它也适用于64位操作数。@barakmanos很棒的链接,谢谢:)N mod常量应该一点也不贵;编译器可以使用类似的技巧将除法转换为倒数乘法等。
b ≡ a0000f000b0000g000c0000h000d00000000e0000 
  ≡ a*base^4 + 0000f000b0*base^3 + 000g000c00*base^2 + 00h000d000*base +00000e0000 
  ≡ a + 0000f000b0 + 000g000c00 + 00h000d000 + 00000e0000 (mod b - 1)
  ≡  000000000a
   + 0000f000b0 
   + 000g000c00 
   + 00h000d000 
   + 00000e0000 (mod b - 1)
 ≡   00hgfedcba (mod b - 1) since there is no carry (no overlap)