【问题标题】:Checking if bit is 1 at a certain position检查某个位置的位是否为 1
【发布时间】:2013-03-23 19:09:37
【问题描述】:

我在 JavaScript 中有一个 4 位数字表示,表示一天中的 4 次(早上、下午、晚上、晚上)。

假设我有十进制数字 13 (1101),它表示必须在晚上、晚上和早上(而不是下午,因为第 2 位是 0)完成一些操作。

到目前为止,我所做的是获取代表白天的 4 位数字(1000 是晚上,0100 是晚上,0010 是下午,0001 是早上),我想做的是创建一个函数来比较2个数字,如果某个位置的位等于1,则返回true。

我知道按位运算符,但我尝试使用它们但仍然没有运气。

【问题讨论】:

  • (x & (1<<bit_pos)) != 0
  • !!(x & (1<<bit_pos))

标签: javascript algorithm bit-manipulation


【解决方案1】:

是的,按位计算。您可以使用简单的位掩码测试。

var PERIODS_OF_DAY = {
  MORNING: 1, AFTERNOON: 2, EVENING: 4, NIGHT: 8
};

var isPeriodOfDay = function(number, period) {
  return !!(number & period);
};

测试号码13

for (period in PERIODS_OF_DAY) {
    if(PERIODS_OF_DAY.hasOwnProperty(period)) {
        console.log(period + ":", isPeriodOfDay(13, PERIODS_OF_DAY[period]));
    }
}

MORNING: true
AFTERNOON: false
EVENING: true
NIGHT: true 

【讨论】:

    【解决方案2】:
    function getTimes (value, time) {
        var times = ["morning", "afternoon", "evening", "night"];
    
        if (time) {
            return !(~value & 1 << times.indexOf(time));
        }
    
        return times.filter(function(time, i) { return !(~value & 1 << i); });
    }
    
    console.log(getTimes(13, "afternoon")); // false
    console.log(getTimes(13)); // ["morning", "evening", "night]
    

    JSFiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2019-11-02
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多