四个数1、2、4、8任意组合求和后的值为X,如何通过X推导出哪些数参与了求和
场景
在读取pcie的一个寄存器地址的值后,发现一个值可以表示多种结果,起初认为这种数据设计不合理,直到我看到了合理的答案,才发现设计思路非常巧妙。经查找资料该种方法叫做子集生成,我是参考二进制法做了一个详细的理解说明和推导过程留作笔记,同时也希望可以帮到大家,下一篇补上C#代码的实现。
幂与二进制数规律的说明
1、2、4、8是数组2的幂,20=1,21=2,22=4,23=8,他们在二进制数中有个特殊性质,每个数对应的二进制数中,只有一个位是1,其他位是0。
数字 | 二进制表示 |
---|---|
1 | 0001 |
2 | 0010 |
4 | 0100 |
8 | 1000 |
如何通过X推导出哪些数参与了求和?
将已知的X转换为二进制表示,每一位的值决定了对应的数是否参与了和为X的运算。
具体来说:如果二进制数中某一位是1,则对应位置的数参与了求和,否则未参与。
推导步骤
- 将X转换为二进制数。
- 判断哪些数参与了求和,查看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 则表示未参与求和。