Java:将signed int转换为unsigned long

时间:2012-11-29 16:15:54

标签: java

首先:我意识到Java不知道任何(非)signess

的事实

我的问题涉及以下情况:

想象一下,你有int i = -1 // ( == 0b1111111_11111111_11111111_11111111)。 现在我想在表示字节值的long中“转换”它,例如在这个具体情况中:long l = 0xFFFFFFFF // ( == 0b1111111_11111111_11111111_11111111)

我的问题是如何在上面的示例中从l获取i

3 个答案:

答案 0 :(得分:3)

你可以使用按位数学,应该从下面的代码中自我解释。如果您不理解,请在评论中提问。

public class LongConversion {
  public static void main(String args[]) {
    for (int i = -1; i > -40; i -= 9) {
      // THIS IS THE IMPORTANT LINE, THE REST IS JUST FOR DEMONSTRATION
      long l = 0x00000000FFFFFFFFl & (long) i;

      System.out.println("Original i: " + i);
      System.out.println(Integer.toHexString(i));
      System.out.println("Longed i: " + l);
      System.out.println(zeroLong(l));
      System.out.println();
    }
  }

  public static String zeroLong(long l) {
    return String.format("%16s", Long.toHexString(l)).replace(' ', '0');
  }
}

此代码输出:

Original i: -1
ffffffff
Longed i: 4294967295
00000000ffffffff

Original i: -10
fffffff6
Longed i: 4294967286
00000000fffffff6

Original i: -19
ffffffed
Longed i: 4294967277
00000000ffffffed

Original i: -28
ffffffe4
Longed i: 4294967268
00000000ffffffe4

Original i: -37
ffffffdb
Longed i: 4294967259
00000000ffffffdb

答案 1 :(得分:0)

Java 8 added some support for dealing with unsigned types。在这种情况下,您可以使用Integer.toUnsignedLong,相当于durron597's answer

def some_function():
    dict1 = {'key1':['1', '2'], 'key2':['3', '4']}
    dict2 = {'key3':['5', '6'], 'key4':['7', '8']}
    yield dict1
    yield dict2

def some_other_function(dict1, dict2):
    "some code using dict1"
    "some code using dict2"

答案 2 :(得分:-1)

您可以使用API​​来完成工作:

long l = Long.parseLong(Integer.toBinaryString(i), 2);

toBinaryString()方法javadoc说

  

返回整数参数的字符串表示形式,作为base 2中的无符号整数。


虽然这种技术没有使用位掩码那么快,但它并不“慢”。

我在我的(典型)PC上做了一些正确的计时,这次转换只花了 270纳秒,这在我的书中仍然非常快。

此外,它使用API​​来完成工作,而不是位功夫,这更容易阅读和自我记录。