[编辑]我不接受任何涉及BigInteger或其他类似低效方法的答案.请在回答之前先阅读问题!
令人讨厌的是,Java不支持无符号数字类型.您可以使用下一个更大的类型将byte,short或int转换为unsigned,例如:
short s = -10;
int unsigned_short = s & 0xFFFF;
Run Code Online (Sandbox Code Playgroud)
但是你不能长久地做到这一点,因为没有更大的类型.
那么,如何将一个签名的long转换为"unsigned"base-X,在我的情况下是base-36,然后返回?Long类具有这些方法,但将longs视为已签名,仅仅因为它们是.
我可以使用一些操作和BigInteger来做到这一点,但BigInteger 非常慢,并通过临时BigInteger创建创建垃圾.我会做很多转换(我想).我需要一个与Long.toString(long i,int radix)的默认实现一样高效的算法.
试图调整Long.toString()的代码我来:
final int RADIX = 36;
final char[] DIGITS = { '0', ... , 'Z' };
long value = 100;
if (value == 0) {
return "0";
} else {
char[] buf = new char[13];
int charPos = 12;
long i = value;
while (i != 0) {
buf[charPos--] = DIGITS[Math.abs((int) (i % RADIX))];
i /= RADIX;
}
return …Run Code Online (Sandbox Code Playgroud) 这个问题是有关,但不是重复的,这一问题.
我的问题略有不同; 我有一个"实用程序模块",在客户端和服务器代码之间共享,它不包含特定于GWT的代码.
我理解通常情况下,所有的资源都被拖入一个特定的项目中,一切都在一起编译.但是有一个问题:当我编译主项目时,我只知道我的实用程序项目是否是"GWT兼容".这太迟了; 我甚至没有开始主要项目,但我想知道在我向我的SCM"提交"之前,我的实用程序项目是"GWT兼容".
换句话说,我想验证实用程序项目的GWT兼容性,独立于它在单独项目(模块)中的使用.
GWT没有覆盖JRE的很大一部分,并且在实用程序模块中特别可能使用非GWT兼容的类或方法.这就是我想要验证的内容.
编辑:我想,我可以添加一个"虚拟入口点",但这使得该项目依赖于GWT,我不想这样做,因为它是"通用"代码,也可供那些不使用的人使用使用GWT.如果重要,我使用Maven作为构建系统.
EDIT2:无论我做什么,我只会通过入口点获得真正的编译/验证(不需要引用任何类).<force> true </ force>,<failOnError> true </ failOnError>都不会.有没有办法可以为共享项目定义该入口点,只有gwt-maven-plugin才能看到它,而不是javac(以免在Java代码中添加不需要的依赖项)?
该匕首文档页说:
要充分利用编译时验证,请创建一个包含应用程序所有模块的模块。
这留下了一些需要回答的问题:
我正在考虑将语言(本土DSL)转换为C vs C++的问题.
15年来我没有做过任何"原生"编程,所以我想检查一下我的假设.
我是否正确地假设转换到最新的C++版本(17)将使本机编译器能够使用更广泛的"现代"Intel/AMD CPU指令,从而产生更高效的可执行文件(超出多线程/内存) - C++的模型部分,它本身似乎已经足够成为C++的理由了)?
换句话说,不是C编译器从未生成的"最近的"CPU指令的很大一部分,仅仅因为它有关于程序员意图的信息太少,因为C的语法更简单?我知道我可以使用汇编程序访问所有CPU指令,但这正是我不想做的.理想情况下,我希望生成的代码仍然尽可能与平台无关.
编辑:
我认为我的目的不被理解,所以负面的投票和评论.我不想知道什么位浮点(双)意味着什么,以及它们是否匹配长的相同位置; 这跟我完全无关.我的问题如下:我想使用单个基本数组来存储我所有的原始值.如果我选择双[]作为"存储",我需要能够存储多头(我也可以反过来做,但问题不会消失,只是反过来).因为两者都是相同的大小,它应该工作,不知何故.使用Double.doubleToRawLongBits(double)和Double.longBitsToDouble(long)允许我这样做.但我想知道的是:"我可以把长时间的投射放到双人和背部,并且总是得到同样的长背?" 如果这是真的,那么它解决了我的问题,我不在乎这些位是否在内部移动.所以我想测试一下我是否能安全地做到这一点.输出表示可以单独访问和修改所有64位,但这可能不足以证明没有长位丢失/修改.
我刚刚通过一个小测试发现,我可以正确地"解决"双重中的每一点,只需通过长时间和后退.这里的测试程序(成功,至少在Java 7/Windows 7 64bit上):
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class TestDoubleBits {
private static double set(final double d, final int bit, final boolean value) {
if (value) {
return ((long) d) | (1L << bit);
} else {
return ((long) d) & ~(1L << bit);
}
}
private static boolean get(final double d, final int bit) {
return (((long) d) & (1L << bit)) != 0;
}
@Test
public void testDoubleBits() {
final …Run Code Online (Sandbox Code Playgroud)