是否可以在Java中对float执行位操作?

时间:2016-05-27 21:32:39

标签: java floating-point bit-manipulation

我有一些C代码,我正在转换为具有大量位操作的java。

我有以下代码:

float test(float uf) {
    return uf ^ (1 << 31);
}

在原始C代码中,uf是无符号值。由于java没有无符号值,我将uf更改为浮点数。现在,我得到一个错误,说第一个类型是浮点数,第二个类型是int。

我知道有它的库,但我只是想使用位操作,只是为了看看我可以用好奇心使用位操作来处理Java。

所以,我的第一个问题是,是否可以在不使用库的情况下使用Java执行上述操作?第二,有没有什么理由你不应该在Java中有点工作(除了有库为你做这个事实)?

4 个答案:

答案 0 :(得分:2)

否。我们不能在浮动中移位。

该操作只是翻转第31位(从第0位开始)。你可以在java中做到这一点就好了。

int test(int uf) {
    return uf ^ (1 << 31);
}

这是你的功能。你遇到的问题不是设置那个位,它知道如果那个数字为负数,那么它实际上是一个大于该数字的数字0xBFFFFFFF。只要你将int作为一个32位的序列处理,而不是在适当的时候检查它的值,你就可以了。

如果你想要32位给你一个正确的数字。使用很长时间。

long test(int uf) {
    return (uf & 0x00000000ffffffffL) ^ (1 << 31);
}

然后你可以在比较中正确使用它,如果你需要它,只需将它转换为int。如果我们将无符号转换为其他类型,那么这是一个比浮点数更优秀的答案。

答案2:我们当然应该在java中使用位操作,因为它们在java中非常快。通常在关键任务代码中,最好在关键点转换为它们,直到仅使用原语,甚至本机编译代码。

答案 1 :(得分:1)

java中的非整数类型不允许按位操作。看到这个参考: http://cs-fundamentals.com/java-programming/java-bitwise-operators.php

任何理由“不能在比特级别工作”。答案是不。在Java中进行逐位操作有许多合理的理由。示例包括JavaCard应用程序,处理低级网络协议等。

答案 2 :(得分:1)

正如其他答案所说,Java中的浮点值没有按位运算。但是,你的问题的这一部分清楚地表明这是XY问题的一个例子:你正在寻找Y的解决方案,而你实际上想要解决X,因为你认为Y是最好的解决方案,但现在你被卡住了。

  

在原始C代码中,uf是无符号值。由于java没有无符号值,我将uf更改为float。现在,我得到一个错误,说第一个类型是浮点数,第二个类型是int。

为什么你不能使用长整数或普通整数?确实,常见的Java算术运算将int值视为signed,但methods in java.lang.Integer对两个int值进行操作,将它们视为无符号。

所以,在C中你会这样做:

unsigned int fun(unsigned int a, unsigned int b) {
    unsigned int x;
    scanf("%u", &x);
    return a * x + b/2u;
}

在Java中你会这样做(请注意,当使用2补码表示时,加法和乘法对有符号或无符号整数的操作相同):

int fun(int a, int b) {
    // You need to get the value as a string first, there is no nextUnsignedInt in Scanner
    int x = Integer.parseUnsignedInt(new java.util.Scanner(System.in).next());
    return a*x + Integer.divideUnsigned(b, 2);
}

答案 3 :(得分:0)

虽然您不能直接将位运算应用于浮点数,但可以将浮点数转换为具有相同位表示的整数(澄清:位将相等,数值不相等)。