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

在Java中是否可以对浮点执行位操作?,java,floating-point,bit-manipulation,Java,Floating Point,Bit Manipulation,我有一些C代码,我正在通过大量位级操作将其转换为java 我有以下代码: float test(float uf) { return uf ^ (1 << 31); } 浮动测试(浮动uf){ 返回uf^(1个。我们不能在浮点中进行位移位。 该操作只需翻转第31位(从第0位开始),您可以在java中很好地实现这一点 int test(int uf) { return uf ^ (1 << 31); } int测试(int-uf){ 返回uf^(1个。我

我有一些C代码,我正在通过大量位级操作将其转换为java

我有以下代码:

float test(float uf) {
    return uf ^ (1 << 31);
}
浮动测试(浮动uf){
返回uf^(1个。我们不能在浮点中进行位移位。
该操作只需翻转第31位(从第0位开始),您可以在java中很好地实现这一点

int test(int uf) {
    return uf ^ (1 << 31);
}
int测试(int-uf){
返回uf^(1个。我们不能在浮点中进行位移位。
该操作只需翻转第31位(从第0位开始),您可以在java中很好地实现这一点

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

在java中,不允许对非整数类型执行按位操作。请参阅以下参考:


至于“不在位级别工作”的任何理由。答案是否定的。在Java中执行位操作有许多正当的理由。示例包括JavaCard应用程序、处理低级网络协议等。

在Java中不允许对非整数类型执行位操作。请参阅此参考:


至于“不在位级别工作”的任何原因答案是否定的。在Java中进行逐位操作有许多正当的理由。示例包括JavaCard应用程序、处理低级网络协议等。

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

在最初的C代码中,uf是一个无符号值。由于java没有无符号值,我将uf改为float。现在,我得到一个错误,第一种类型是float,第二种类型是int

为什么你不能使用长的或正常的int?这是真的,普通的java算术运算把int值看作是签名的,但是在两个int值上操作它们,把它们看作无符号。 那么,在C中,您将执行以下操作:

unsigned int fun(unsigned int a, unsigned int b) {
    unsigned int x;
    scanf("%u", &x);
    return a * x + b/2u;
}
在Java中,您可以这样做(注意,当使用2-补码表示时,加法和乘法对于有符号或无符号整数都是相同的操作):


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

在最初的C代码中,uf是一个无符号值。由于java没有无符号值,我将uf改为float。现在,我得到一个错误,第一种类型是float,第二种类型是int

为什么你不能使用长的或正常的int?这是真的,普通的java算术运算把int值看作是签名的,但是在两个int值上操作它们,把它们看作无符号。 那么,在C中,您将执行以下操作:

unsigned int fun(unsigned int a, unsigned int b) {
    unsigned int x;
    scanf("%u", &x);
    return a * x + b/2u;
}
在Java中,您可以这样做(注意,当使用2-补码表示时,加法和乘法对于有符号或无符号整数都是相同的操作):



当然,您可以实现自己的“浮动上的位移位”,但是。至于你的第二个问题:非整数类型上的位移位对人类来说比整数类型上的位移位更难解释。因此,有人可能会认为此操作降低了代码的可理解性。你已经破坏了代码:任意32位值(典型的无符号值)不完全适合只有24位尾数的32位浮点。会有截断。因此,将无符号转换为浮点不起作用。您可能可以尝试双倍,但我怀疑您的想法是错误的,您应该尝试其他方法。如果您在C中使用32位整数,那么在Java中尝试64位长度。您可以模拟uint和int很好。你不能用浮点来模拟uint。如果你真的想操纵
float
的位,你可以使用
float.floatToIntBits(float)
。但听起来你并不是真的想这么做。@Sam是的,我只是想用位操作来实现它。你当然可以实现自己的操作“浮点上的位移位”,但是。至于你的第二个问题:非整数类型上的位移位比整数类型上的位移位更难解释。因此,有人可能会认为此操作降低了代码的可理解性。你已经破坏了代码:任意32位值(典型的无符号值)不完全适合只有24位尾数的32位浮点。会有截断。因此,将无符号转换为浮点不起作用。您可能可以尝试双倍,但我怀疑您的想法是错误的,您应该尝试其他方法。如果您在C中使用32位整数,那么在Java中尝试64位长度。您可以模拟uint与int的关系很好。你不能用浮点来模拟uint。如果你真的想操纵
float
的位,你可以使用
float.floatToIntBits(float)
。但这听起来并不是你想要做的。@Sam是的,我只是想用位运算来做。问题的标题专门问关于
float
s上的位运算。因此,这个答案完全忽略了第一个问题。第二个问题没有回答。FWIW你可以轻松地翻转一个浮子…并不是说它能帮你general@Turing85专业提示:这与
uf^不同(1)好吧,但是在那里有一个浮子并不能解决OPs问题,只能解决他的怪问题attempt@JustBlossom这个问题很好,但这是一个典型的XY问题,你选择的解决问题的方法不起作用。即使我们解决了你眼前的问题(即否定浮动),你也会遇到越来越多的麻烦,其中一些真的会发生