【问题标题】:How to use bitwise operators to return bits that have 0如何使用按位运算符返回具有 0 的位
【发布时间】:2012-08-21 20:19:02
【问题描述】:

我已经在这个问题上苦苦挣扎了很长时间。这是此答案 (How to divide x number of players into 2 teams randomly multiple times, differently every time?) 的后续问题。

所以,我有 x 个玩家,我给每个玩家 1 << n 掩码值。通过使用这些面具,我可以轻松地与每支球队的 2 名球员组成一场比赛。现在,如果玩家总数为 5,那么一场可能的比赛可能是这样的:

01100 team a
00011 team b
------------
10000 player resting

或者如果有 6 个玩家,它可能看起来像这样:

100010 team a
001001 team b
-------------
000100 player resting
010000 player resting

问题
我如何通过比较 a 队和 b 队的面具来得到那些休息的球员? (我是一个完全按位的菜鸟,所以非常感谢代码示例)

谢谢

【问题讨论】:

    标签: javascript bit-manipulation


    【解决方案1】:

    对团队 A 和 B 的值执行 XOR

    var resting = a ^ b;
    

    然后休息的玩家将被标记为0,即:

    100010 team a
    001001 team b
    -------------
    101011 players resting
    

    最后,遍历结果的每一位:

    var totalPlayers = 6;
    
    for (var i = 1; i <= totalPlayers; i++) {
    
       if ((resting & 1) === 0) {
           console.log("Player #" + i + " is resting.");
       }
    
       resting >>>= 1;
    }
    

    这是一个实时示例:http://ideone.com/Kb3XJ(在 Java 中,不是 JavaScript,但这不是问题)

    【讨论】:

    • 如果休息的球员不是最后一位,你的 sn-p 工作正常。见这里:jsfiddle.net/Mm4MM/1。你知道解决办法吗?
    • 那是因为011011 等于11011。您必须将玩家总数存储在单独的变量中,然后将 for 循环条件从 resting != 0 更改为 i &lt;= totalPlayers - 看看我的编辑。 JSFiddle live example
    • 酷,这是一个我看不到的简单修复。谢谢!
    【解决方案2】:

    您可以将它们按位或放在一起,然后不要让所有休息的玩家。然后,您将不得不一点一点地获得单独的休息球员。

    100010 
    001001
    ------OR
    101011 #all players playing
    ------NOT
    010100 #all players not playing
    

    【讨论】:

      猜你喜欢
      • 2013-04-16
      • 1970-01-01
      • 2022-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多