欲买桂花同载酒,荒泷天下第一斗。|

janbar

园龄:4年6个月 粉丝:29 关注:10

2020-09-17 21:10 阅读 112 评论 0 推荐

不用加减乘除做加法,求2个数的平均数

1.不用加减乘除做加法

copy
1.分析二进制加法规律: carry = A&B sum = A^B output = carry<<1 + sum = (A&B)<<1 + (A^B) 2.上面仍然用了加法,因此还要继续拆分加法,直到carry=0及没有进位结束 ╔═══════╤═════════════╗ ║ Input │ Output ║ ╠═══╤═══╪═══════╤═════╣ ║ A │ B │ carry │ sum ║ ╟───┼───┼───────┼─────╢ ║ 0000 ║ ╟───┼───┼───────┼─────╢ ║ 1001 ║ ╟───┼───┼───────┼─────╢ ║ 0101 ║ ╟───┼───┼───────┼─────╢ ║ 1110 ║ ╚═══╧═══╧═══════╧═════╝ 3.因此可以用下面方法计算A+B 表示:进位<<1 + 无进位和 最终得到:A+B = (A&B)<<1 + (A^B) func getSum(A, B int) int { for B != 0 { carry := (A & B) << 1 // 进位 A ^= B // 无进位和 B = carry // 继续作为下一个加法迭代 } return A } 4.其实还有一种方案,我们可以观察(A|B)<<1 表示:(进位+无进位和)<<1 拆开:进位<<1 + 无进位和<<1 = 进位<<1 + 无进位和*2 根据步骤3,可以将上面减去一个无进位和 最终得到:A+B = (A|B)<<1 - (A^B)

2.求(A+B)/2

  1. 正常解法:(A+B)/2
  2. 高效解法:(A+B)>>1
  3. 防止溢出,二分查找常用:A+(A-B)/2 或 A+(A-B)>>1
  4. 根据上面步骤3推导:(A&B) + (A^B)>>1
  5. 根据上面步骤4推导:(A|B) - (A^B)>>1

3.比较求A,B平均数结果

copy
package main import ( "fmt" ) func main() { a, b := 123, 456 check(a, b) check(-a, b) check(a, -b) check(b, a) check(-b, a) check(b, -a) } func check(A, B int) { fmt.Printf("(%d + %d)/2 = %d\n", A, B, (A+B)/2) fmt.Printf("(%d + %d)>>1 = %d\n", A, B, (A+B)>>1) fmt.Printf("%d + (%d - %d)/2 = %d\n", B, A, B, B+(A-B)/2) fmt.Printf("%d + (%d - %d)>>1 = %d\n", B, A, B, B+(A-B)>>1) fmt.Printf("%d + (%d - %d)>>1 = %d\n", B, A, B, B+(A-B)>>1) fmt.Printf("(%d & %d) + (%d ^ %d)>>1 = %d\n", A, B, A, B, (A&B)+(A^B)>>1) fmt.Printf("(%d | %d) - (%d ^ %d)>>1 = %d\n", A, B, A, B, (A|B)-(A^B)>>1) } 根据结果可以看出最后2种方案在(A+B)为奇数时的表现结果不同 结果为正奇数时: (A&B) + (A^B)>>1为向下取整,(A|B) - (A^B)>>1为向上取整 结果为负奇数时相反
posted @   janbar  阅读(112)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~

FAVOURITE

点击右上角即可分享
微信分享提示
*✧⁺˚⁺ପ(๑・ω・)੭ु⁾⁾ 好好学习天天向上
进入亮色模式
进入亮色模式

FAVOURITE