中班 先得出某些背景图专业知识:
(1)比如,7/2=3 ._ 1 -7/2=-3 ._ 更关键的是,余数的绝对值低于除数的绝对值,余数和收益是正数和负数。
(2)因为c语言的除法被舍入为0,即“断开除法” 不难发现,当正数除于正数时,断开除法等于往下舍入(3.6 - > 3);当负值除于正数时,断开除法等于往上舍入(-3.6 - > - 3) (3)一般将k的幂除于
2令其k往右边中移动。考虑到这里除于2。 应用带符号的字节数表达7,即00000111,并将一名挪动到00000011到3,它是恰当的。 可是,考虑到-7/2,-7是11111001,而且在将一名变成11111100以后,它是-
4,由于它是四舍五入的結果,因此它比正确答案-3小1。 以便编码的完整性和高效率,假如这是1个31位大数字,28位拓展标记位将最先右移。最开始是正数,最大位是0,那么最终一名将变成31 0,即0;初始负值为1,最后将变成31 1,即-1,临时将此拓展标记位后边产生的大数字纪录为S, 随后,人们只必须将一名的結果往右边中移动并减掉该S以得到断开除法的恰当值。 7/2=7>> 1 - (0)=3 -7/2=-7>> 1 - ( - 1)=-3 (这将在实例编码中再度提及)
(4)当除于正数N且N并不是2的幂时,编译器转化成magic_number
(C)以提升除法乘法,进而提高工作效率。
温馨提醒,我注重.(n,c)此值已匹配。一般,往右边挪动的比特数n超过32(缘故将在后边表述),比如,n是76,因而C是常数。
中的证实说明除数(正数)乘于magic_number随后右移n位,它是除法的結果;假如是负值,则必须为+1。 它是恰当的._它是第三条,最终你能减掉标记拓展所产生的大数字。 好的,背景图基本上同样,赶到CTFtime上的主题风格:https://ctftime.org/task/5294?tdsourcetag=s_pcqq_aiomsg
简易而言,它是除法提升编码除于N.难题一般是二进制检索来得到标示。它是1个更真實的人.用数学课来处理 在汇编编码中,0x49ea309a821a0d01是magic_number Sar $0x3f,%rdi 由于long long是32位,因此函数参数rdi(divide)往右边挪动62位。假如初始为正,则rdi变成4.假如初始为负,则rdi变成-1。
在imul%rdx以后,由于被除数储存在rax中,因此商品high放到rdx中,low放置rax中,最终人们发觉商品low rax之后已不应用。 缘故是在后台管理提及的第四,n值超过32,因此126位商品只必须考虑到rdx,商品低32位rax迁移到0,不用考虑到,也要提高工作效率 以后,由于rax是返回值,x * c>> n储存在rax中,随后是sub rax,rdi 换句话说,人们减掉标记拓展所产生的大数字。
这一直接证据将会必须了解(手写计算多次._) 好的,如今我们一起看一下旗子多少钱。 由于人们只保存了商品高rdx,因此人们将rdx往右边中移动了0x30。 这等于将126位乘积往右边挪动(32 +0x30)==103位。 随后,由于c=2 ^ n/y y=2 ^ n/c (在其中c是magic_number) 如今c被称作0x49ea309a821a0d01,n是己知的,是103 测算除数y 温馨提醒,尽管除法的結果是精确的,可是当应用逆除数时,Python测算的結果将会有1个不正确。应用二进制算法时也会产生这种情况。 事实上,除开二种状况的正例和蚁群算法以外,编译器将依据C的值具备不一样的挑选。它是提升关系式2除于[2x9A8B]和正非2次幂,比如做为这一难题。
而且沒有探讨略微繁杂的除数状况。有关內容能够在《数据加密与破译》和《数据加密与破译》中见到。两者是全方位的,前者更加推理。