将按位运算(i& 1)从C ++转换为Java

时间:2014-01-19 12:31:51

标签: java c++ bitwise-operators

我在OpenGL的书籍/教程中有以下C ++代码:

    for (int i = 0; i < 256; i++)
    {
        droplet_x_offset[i] = random_float() * 2.0f - 1.0f;
        droplet_rot_speed[i] = (random_float() + 0.5f) * ((i & 1) ? -3.0f : 3.0f);
        droplet_fall_speed[i] = random_float() + 0.2f;
    }

现在我已经尝试将其转换为Java,而且大部分都是微不足道的:

    Random random = new Random();
    for (int i = 0; i < 256; i++) {
        dropletXSpeed[i] = random.nextFloat() * 2.0f - 1.0f;
        dropletRotSpeed[i] = (random.nextFloat() + 0.5f) * ((i & 1) ? -3.0f : 3.0f);
        dropletFallSpeed[i] = random.nextFloat() + 0.2f;
    }

除了Java不接受((i & 1) ? -3.0f : 3.0)并且消息:
 不兼容的类型:int无法转换为boolean

有人可以解释一下(i & 1)到底是做什么以及如何在Java中替换它?

2 个答案:

答案 0 :(得分:3)

与C / C ++不同,Java条件必须求值为布尔值。

例如:

int i = 1;
if (i) { ... }

在java中无效。

你的三元组必须是:

(i & 1) != 0 ? -3.0f : 3.0f;

答案 1 :(得分:1)

使用三字符不如简单情况的公式有效。这是因为分支遗漏是如此昂贵。你也可以这样做。

(3 - 6 * (i & 1))

如果i为偶数,则为3;如果为奇数,则为-3。

注意:因为你有一个循环,所以有一个更简单的解决方案。

for (int i = 0; i < 256; i += 2) {
    dropletXSpeed[i] = random.nextFloat() * 2.0f - 1.0f;
    dropletXSpeed[i+1] = random.nextFloat() * 2.0f - 1.0f;
    dropletRotSpeed[i] = (random.nextFloat() + 0.5f) * 3.0f;
    dropletRotSpeed[i+1] = (random.nextFloat() + 0.5f) * -3.0f;
    dropletFallSpeed[i] = random.nextFloat() + 0.2f;
    dropletFallSpeed[i+1] = random.nextFloat() + 0.2f;
}

BTW nextFloat()相当昂贵。如果你不需要24位随机性,你可以试试这样的东西。

public float next8bitFloat() {
    return random.nextInt(256) * (1.0 / 256);
}