使用Javascript查找两个团队何时会在一个括号中相遇

使用Javascript查找两个团队何时会在一个括号中相遇,javascript,math,Javascript,Math,我正在寻找一种方法来判断两支球队将在一个标准的运动等级中进行什么回合和比赛(回合中的位置) 假设括号内有16支队伍,按数字顺序排列。 我想快速输入两个团队编号并得到答案 以下是团队开会时间的一些示例: 第1队对第16队(只能在决赛中相遇) 第四轮-第1场 第11队对第15队(将在半决赛中相遇) 第三轮-第二场 第三队对第四队(将在第一轮相遇) 第一轮-第二场 我相信我可以用循环来实现这一点,但我有一种感觉,这将是一个基于数学的解决方案,它将更干净、更有效 任何一个数学公式都做不到 如果将团队编号

我正在寻找一种方法来判断两支球队将在一个标准的运动等级中进行什么回合比赛(回合中的位置)

假设括号内有16支队伍,按数字顺序排列。 我想快速输入两个团队编号并得到答案

以下是团队开会时间的一些示例:

第1队对第16队(只能在决赛中相遇)

第四轮-第1场

第11队对第15队(将在半决赛中相遇)

第三轮-第二场

第三队对第四队(将在第一轮相遇)

第一轮-第二场

我相信我可以用循环来实现这一点,但我有一种感觉,这将是一个基于数学的解决方案,它将更干净、更有效

任何一个数学公式都做不到

如果将团队编号从0开始,而不是从1开始,则只有当两个团队编号的第三个二进制位不同时,两个团队才能在决赛中相遇:

if ((teamA ^ teamB) & 8 != 0) {
    // meet in final
    round = 4;
    match = 1;
}
如果他们有可能在半决赛中相遇,那么只有当他们的队号的第二个二进制位不同,并且他们在上一次测试中没有被抓住时,才会发生这种情况:

else if ((teamA ^ teamB) & 4 != 0) {
    // meet in semi-final
    round = 3;
    match = Math.floor(teamA / 8) + 1;
}
&等等

一个简单的循环实际上可以很好地做到这一点:

for (var round = 4; round > 0; --round) {
    if ((teamA ^ teamB) & (1 << (round - 1))) {
        match = (teamA >> round) + 1;
        break;
    }
}
for(var round=4;round>0;--round){
如果((团队A^团队B)和(1>轮)+1;
打破
}
}

到目前为止,您尝试了什么?我写了这个,看起来很有效,但感觉很笨拙。-将链接到JSFIDLE,因为代码高亮显示对我不起作用!当然,没问题,我做的一件事就是更改团队编号,使其可以在一个数组中(例如,团队1是0-团队16是15).@Richard从零开始计算团队编号确实让计算变得简单多了!感谢您的帮助;我正在查看您的循环,它似乎有意义!我会让您知道的!@Richard我稍微修改了循环版本以简化它