如何用整数表示二进制选项集并在后续解码?
我知道大多数语言都有内置函数能实现这个功能,但我一直觉得这是给函数传选项的巧妙技巧,所以别推荐内置函数。我甚至不觉得这是好的编程实践,但这个问题困扰我好几年了。
核心思路
传入单个整数参数$myOptions,用它代表多个开关型二进制选项。后续可能会新增选项,目前暂不确定具体内容。每个选项定义如下:
mFoo = 1 mBar = 2 mFoobar = 4 mFubar = 8 mPhoobar = 16 mPhubar = 32
选项取值规律
每个选项对应二进制位位置的2的幂:
- 位置0:
mFoo= 2⁰ = 1 - 位置1:
mBar= 2¹ = 2 - 位置2:
mFoobar= 2² = 4 - 位置3:
mFubar= 2³ = 8 - 位置4:
mPhoobar= 2⁴ = 16 - 位置5:
mPhubar= 2⁵ = 32
新增选项的取值逻辑很清晰——按二进制位顺序取下一个2的幂即可。使用时,将需要开启的选项对应值相加得到总和,后续再解码这个总和来判断哪些选项被开启。例如,要开启除mFubar外的所有选项,总和为1+2+4+16+32=55。
解码方法
我一直记不清如何解码这个整数来判断某个选项是否开启。反复尝试后发现,使用按位与运算符(C#中为&)即可实现。比如判断mFubar是否开启,执行以下检查:
(55 & mFubar) != 0
55与8按位与的结果为0,说明mFubar未开启;同理,检查mPhoobar(值为16)时,55&16的结果为16,不等于0,说明该选项已开启。
我的疑问
我是不是遗漏了什么?我记得这个方法看似简单,实则可能存在隐藏的问题。随着OOP的普及,这种选项处理方式已经成为老旧的编程遗留技巧,但在过去系统资源匮乏的年代,它确实非常实用。
内容的提问来源于stack exchange,提问作者WhiskerBiscuit
相关产品推荐
相关产品推荐

