看书笔记,整数除法的编译优化 & 逆向识别除法

看书笔记,整数除法的编译优化

1.除法,公式中的c一般称为MAGIC_NUM

(1)有符号数除法,除数为2^n

数学优化公式:

if (x >= 0):
	x / 2^n = x>>n
else:
	x / 2^n = (x + (2 ^ n - 1)) >> n   

(2)有符号数除法,除数为-2^n

数学优化公式:

if (x >= 0):
	x / -2^n = -(x>>n)
else:
	x / -2^n = -((x + (2 ^ n - 1)) >> n)   

(3)有符号数除法,除数为正非2^n

数学优化公式1:

  1. 32位除法:
if (x >= 0):
	x / o = x * c >> 32 >>n
else:
	x / o = (x * c >> 32 >> n) + 1  
  1. 64位除法:
if (x >= 0):
	x / o = x * c >> 64 >>n
else:
	x / o = (x * c >> 64 >> n) + 1  

c为正数(二进制最高位为0),n可能为0

数学优化公式2:

  1. 32位除法:
if (x >= 0):
	x / o = (x * c >> 32) + x >> n
else:
	x / o = ((x * c >> 32) + x >> n) + 1
  1. 64位除法:
if (x >= 0):
	x / o = (x * c >> 64) + x >> n
else:
	x / o = ((x * c >> 64) + x >> n) + 1

c为负数

o = 2^n / c, n 为 右移总次数

(4)有符号数除法,除数为负非2^n

数学优化公式1:

  1. 32位除法:
if (x >= 0):
	x / o = x * c >> 32 >>n
else:
	x / o = (x * c >> 32 >> n) + 1  
  1. 64位除法:
if (x >= 0):
	x / o = x * c >> 64 >>n
else:
	x / o = (x * c >> 64 >> n) + 1  

c为负数(二进制最高位为1),n可能为0

数学优化公式2:

  1. 32位除法:
if (x >= 0):
	x / o = (x * c >> 32) - x >> n
else:
	x / o = ((x * c >> 32) - x >> n) + 1
  1. 64位除法:
if (x >= 0):
	x / o = (x * c >> 64) - x >> n
else:
	x / o = ((x * c >> 64) - x >> n) + 1

c为正数

32位:|o| = 2^n / (2^32 - c), 64位:|o| = 2^n / (2^64 - c) ,n 为 右移总次数

(5)无符号数除法,除数为2^n, 略

(6)无符号数除法,除数为非2^n

数学优化公式:

  1. 32位除法:
x / o = x * c >> 32 >> n
  1. 64位除法:
x / o = x * c >> 64 >> n

o = 2 ^ (32 + n)/ c , (32 + n)为右移总次数;64位同理

(7)无符号数除法,除数为非2^n b

数学优化公式:

  1. 32位除法:
x / o = (x - (x * c >> 32) >> n1) + (x * c >> 32) >> n2
  1. 64位除法:
x / o = (x - (x * c >> 64) >> n1) + (x * c >> 64) >> n2

o = 2 ^ (32 + n)/ 2^32 + c , n = n1 + n2;64位同理

2.求余

(1)取模运算,除数为2^n

公式1:

if (x >= 0):
	x % 2^n = x & (2^n  - 1)
else:
	x % 2^n = (x & (2^n - 1)) - 1 | (~(2^n - 1)) + 1

公式2:

if (x >= 0):
   x % 2^n = x & (2^n  - 1)
else:
   x % 2^n = (x + (2^n - 1) & (2^n - 1)) - (2^n - 1)

(1)取模运算,除数为非2^n

余数 = 被除数 - 商 * 除数
优化公式:

x % c = x - x / c * c

x/c会被优化,根据乘数c快速识别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
System.currentTimeMillis()用于获取当前时间的毫秒数,而除以1000是为了将毫秒数转换为秒数。这个操作是在浮点上下文中进行的整数除法。在计算机中,整数除法会取整数的商,舍弃小数部分。因此,System.currentTimeMillis() / 1000会得到当前时间的秒数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JAVA基础复习专栏](https://blog.csdn.net/qq_41842605/article/details/106560029)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [System.currentTimeMillis()计算方式与时间的单位转换详解](https://download.csdn.net/download/weixin_38651812/12725398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [java学习笔记(13) 第13章 - 常用类](https://blog.csdn.net/m0_50736744/article/details/121615761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值