Maj*_*our 5 javascript algorithm flags
在我正在研究的一些代码中,我应该处理十个独立的参数,这些参数可以采用两个值中的一个(0或1).这会产生2 ^ 10个不同的条件.有些条件永远不会发生,可以省略,但那些确实发生的情况仍然很多,并且switch处理所有案件都是疯了.
我想使用10个if语句而不是巨大的语句switch.为此,我知道我应该使用标志位,或者更确切地说标记字节,因为语言是javascript,并且更容易使用10字节字符串来表示10位二进制.
现在,我的问题是,我不知道如何实现这一点.我已经看到这在APIs中使用,其中多个可选择的选项用数字1,2,4,8,...,n ^(n-1)公开,它们是1,10,100,1000等的十进制等值.在二进制.因此,如果我们进行调用bar = foo(7),bar将是一个具有三个最右边标志启用的任何选项的对象.
我可以将十进制数转换为二进制数,并在每个if语句中检查是否设置了相应的数字.但我想知道,有没有办法确定n-th十进制数字的数字是零或一二进制形式,而不实际进行转换?
只需使用按位和.在C/C++中,这将是:
if (flags & 1) {
// Bit zero is set.
}
if (flags & 2) {
// Bit one is set.
}
if (flags & 4) {
// Bit two is set.
}
...
Run Code Online (Sandbox Code Playgroud)
为了生产良好,使用标志名称的符号名称而不是幻数,1,2,4,8等.
如果标志在某种程度上是同质的(例如,它们在某些几何问题中代表十个空间维度)并且处理每个案例的代码是相同的,则可以使用循环:
for (int f = 0; f < 10; ++f) {
if (flags & (1 << f)) {
// Bit f is set.
}
}
Run Code Online (Sandbox Code Playgroud)