我在Long类中找到了一个方法
public static long reverse(long i) {..}
这种方法有什么用?
如果32位处理器的长度确实只有32位,那么数学运算如何处理64位数?例如:
long lngTemp1 = 123456789123;
long lngTemp2 = lngTemp1 * 123;
Run Code Online (Sandbox Code Playgroud)
根据MSDN,C#中有一个长期签名的64位数字:http://msdn.microsoft.com/en-us/library/ctetwysk(VS.71).aspx
32位英特尔微处理器如何能够执行代码,如上所述而不会出现溢出?
我有位移和无符号长的问题.这是我的测试代码:
char header[4];
header[0] = 0x80;
header[1] = 0x00;
header[2] = 0x00;
header[3] = 0x00;
unsigned long l1 = 0x80000000UL;
unsigned long l2 = ((unsigned long) header[0] << 24) + ((unsigned long) header[1] << 16) + ((unsigned long) header[2] << 8) + (unsigned long) header[3];
cout << l1 << endl;
cout << l2 << endl;
Run Code Online (Sandbox Code Playgroud)
我希望l2也有2147483648的值,但它打印18446744071562067968.我假设第一个字节的位移会导致问题?
希望有人可以解释为什么这会失败以及我如何修改l2的计算以便它返回正确的值.
提前致谢.
标题非常明显.我正在从C#转向Java.我有一个对象和一个返回其ID的getter方法.我想比较两个相同类型的对象的ID,并检查它们的id值是否相等.
尝试:
obj.getId() == obj1.getId();
Run Code Online (Sandbox Code Playgroud)
Long id1 = obj.getId();
Long id2 = obj1.getId();
assertTrue(id1.equals(id2))
Run Code Online (Sandbox Code Playgroud)
assertTrue(id1== id2)
Run Code Online (Sandbox Code Playgroud) 我正在尝试用C++ for Windows(MinGW)和Linux(g ++)编写跨平台代码.我习惯在Linux中将64位整数定义为"long",但当我移动到MinGW时,sizeof(long)返回4个字节.然后我发现我可以使用"long long"或"__INT64"在MinGW中定义64位整数.我有两个问题:
1.-为Windows和Linux定义64位整数的最便携方式是什么?我目前正在使用#ifdef,但我不知道这是否是最好的方法:
#ifdef LINUX
#define INT64 long
#elif WIN32
#define INT64 long long
#endif
Run Code Online (Sandbox Code Playgroud)
2.- 我应该在MinGW中使用"long long"还是"__INT64"?为什么?
long val = 5000000000;
Run Code Online (Sandbox Code Playgroud)
此分配期间的错误是"类型int的文字5000000000超出范围".为什么编译器默认假定文字是int?
我试图在PHP中将64位浮点数转换为64位整数(并返回).我需要保留字节,所以我正在使用pack和unpack函数.我正在寻找的功能基本上是Java的Double.doubleToLongBits()方法.http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#doubleToLongBits(double)
我设法得到这个远远的帮助来自php docs for pack()的评论:
function encode($int) {
$int = round($int);
$left = 0xffffffff00000000;
$right = 0x00000000ffffffff;
$l = ($int & $left) >>32;
$r = $int & $right;
return unpack('d', pack('NN', $l, $r))[1];
}
function decode($float) {
$set = unpack('N2', pack('d', $float));
return $set[1] << 32 | $set[2];
}
Run Code Online (Sandbox Code Playgroud)
这很好用,大部分......
echo decode(encode(10000000000000));
Run Code Online (Sandbox Code Playgroud)
亿
echo encode(10000000000000);
Run Code Online (Sandbox Code Playgroud)
1.1710299640683E-305
但是这里变得棘手......
echo decode(1.1710299640683E-305);
Run Code Online (Sandbox Code Playgroud)
-6629571225977708544
我不知道这里有什么问题.亲自试试:http://pastebin.com/zWKC97Z7
你需要在Linux上使用64位PHP.该网站似乎模拟了该设置:http://www.compileonline.com/execute_php_online.php
这可能是一个愚蠢的事情,但编译器如何才能显示这一点Long.Max = 9223372036854775807
?
我需要做以下算术:
long a,b,c;
long result = a*b/c;
Run Code Online (Sandbox Code Playgroud)
虽然结果保证适合long
,但乘法不是,所以它可以溢出.
我试图一步一步地进行(首先乘法再划分),同时通过将中间结果拆分a*b
为最大4的大小的int数组来处理溢出(就像BigInteger使用其int[] mag
变量一样).
在这里,我被这个部门困住了.我无法理解进行精确划分所需的按位变换.我需要的只是商(不需要余数).
假设的方法是:
public static long divide(int[] dividend, long divisor)
Run Code Online (Sandbox Code Playgroud)
此外,我不考虑使用,BigInteger
因为代码的这部分需要快速(我想坚持使用原语和原始数组).
任何帮助将非常感激!
编辑:我不是要BigInteger
自己实现整个.我想要做的是比使用泛型更快地解决特定问题(a*b/c
哪里a*b
可以溢出)BigInteger
.
编辑2:如果它可以以一种聪明的方式完成,完全没有溢出,注释中出现了一些提示,那将是理想的,但我仍在寻找一个正确的方法.
更新: 我尝试将BigInteger代码移植到我的特定需求,没有创建对象,并且在第一次迭代中,与使用BigInteger(在我的开发PC上)相比,我的速度提高了约46%.
然后我尝试了一下修改@大卫Eisenstat的解决方案,这给了我〜56%(我跑100_000_000_000随机输入来自Long.MIN_VALUE
于Long.MAX_VALUE
减少)运行的时间(超过2倍)比较的BigInteger(即〜18%相比,我的适应BigInteger的算法中) .
优化和测试会有更多的迭代,但在这一点上,我认为我必须接受这个答案是最好的.