我正在看这段代码:
/**
* Bitmask of states
*/
export const enum ViewState {
FirstCheck = 1 << 0, // result is 1
ChecksEnabled = 1 << 1, // result is 2
Errored = 1 << 2, // result is 4
Destroyed = 1 << 3 // result is 8
}
我不明白为什么不简单地指定那里的整数结果或整数0,1,2,3
。有没有人有任何想法?
答案 0 :(得分:5)
因为它更容易阅读(无论如何它对我来说,显然也是作者)。随着这个列表的增长,它更容易(对于人类)添加第16个元素并使用1&lt;&lt; 15然后找出结果值将是什么。所以只是一个偏好的问题
使用shift的原因是您可以将多个状态组合成一个值。示例:值为6将为Errored
和ChecksEnabled
。
var combined = ViewState.ChecksEnabled | ViewState.Errored;
var isChecksEnabled = (combined & ViewState.ChecksEnabled) == ViewState.ChecksEnabled;
// or
var isChecksEnabled = !!(combined & ViewState.ChecksEnabled);
答案 1 :(得分:3)
这个枚举模拟了四个标志的概念,每个标志可以是/ true / one或off / false / zero。您可以通过逻辑OR运算所需的值来将枚举设置为值。例如:
z = ViewState.FirstCheck | ViewState.ChecksEnabled
稍后在代码中,您可以通过逻辑1将值与您要检查的值相互独立地检查这些值:
if (z & ViewState.FirstCheck) {
do_something();
}
if (z & ViewState.ChecksEnabled) {
do_something_else();
}
确保将枚举值分解为明确的,明确的标志集的最简单方法是将单独的值作为2的幂。