四个数1、2、4、8任意组合求和后的值为X,如何通过X推导出哪些数参与了求和

场景

在读取pcie的一个寄存器地址的值后,发现一个值可以表示多种结果,起初认为这种数据设计不合理,直到我看到了合理的答案,才发现设计思路非常巧妙。经查找资料该种方法叫做子集生成,我是参考二进制法做了一个详细的理解说明和推导过程留作笔记,同时也希望可以帮到大家,下一篇补上C#代码的实现。

幂与二进制数规律的说明

1、2、4、8是数组2的幂,20=1,21=2,22=4,23=8,他们在二进制数中有个特殊性质,每个数对应的二进制数中,只有一个位是1,其他位是0。

数字二进制表示
10001
20010
40100
81000

如何通过X推导出哪些数参与了求和?

将已知的X转换为二进制表示,每一位的值决定了对应的数是否参与了和为X的运算。
具体来说:如果二进制数中某一位是1,则对应位置的数参与了求和,否则未参与。

推导步骤

  1. 将X转换为二进制数。
  2. 判断哪些数参与了求和,查看X的二进制数中的每一位,从右往左分别是第1/2/3/4位,对应上述表格查看。

示例说明

示例1:1+2=3,X=3

二进制数表示为:0011
第一位:1,则1参与;
第二位:1,则2参与;
第三位:0,则4未参与;
第四位:0,则8未参与。
因此,1和2参与求和。

示例2:1+8=9,X=9

二进制数表示为:1001
第一位:1,则1参与;
第二位:0,则2未参与;
第三位:0,则4未参与;
第四位:1,则8参与。
因此,1和8参与求和。

总结

通过将任意组合求和结果X转换为二进制表示,可以直观的看出哪些数(1、2、4、8)参与了这个和。每一位上的 1 表示对应位置的数参与了求和,0 则表示未参与求和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值