首先:我意识到Java不知道任何(非)signess
的事实我的问题涉及以下情况:
想象一下,你有int i = -1 // ( == 0b1111111_11111111_11111111_11111111)
。
现在我想在表示字节值的long中“转换”它,例如在这个具体情况中:long l = 0xFFFFFFFF // ( == 0b1111111_11111111_11111111_11111111)
。
我的问题是如何在上面的示例中从l
获取i
。
答案 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来完成工作,而不是位功夫,这更容易阅读和自我记录。