我有一些C代码,我正在转换为具有大量位操作的java。
我有以下代码:
float test(float uf) {
return uf ^ (1 << 31);
}
在原始C代码中,uf
是无符号值。由于java没有无符号值,我将uf
更改为浮点数。现在,我得到一个错误,说第一个类型是浮点数,第二个类型是int。
我知道有它的库,但我只是想使用位操作,只是为了看看我可以用好奇心使用位操作来处理Java。
所以,我的第一个问题是,是否可以在不使用库的情况下使用Java执行上述操作?第二,有没有什么理由你不应该在Java中有点工作(除了有库为你做这个事实)?
答案 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)
虽然您不能直接将位运算应用于浮点数,但可以将浮点数转换为具有相同位表示的整数(澄清:位将相等,数值不相等)。