使用 java 和 python 将字符串 long 解析为 int
Parsing string long to int with java and python
我正在尝试将一些 java 代码转换为 python。我对以下 java 行有疑问:
int toto = (int)Long.parseLong("11101101111110100111001110011010",2);
String result = Integer.reverseBytes(toto);
在 java 中,我得到了这些结果:
Long.parseLong("11101101111110100111001110011010",2) = 3992613786
(int)Long.parseLong("11101101111110100111001110011010",2) = -302353510
Integer.reverseBytes(toto) = -1703675155
我想我理解了第一行,但为什么这里有一个“(int)”?它应该做什么? (我是 java 和字节管理方面的初学者,我找不到关于这一点我理解的任何文档)。
在 python 中,我设法通过转换为基数 2 获得了第一个结果(我完全是偶然发现的):
int("11101101111110100111001110011010",2) = 3992613786
但是我怎样才能得到“int”的结果,然后得到“reverse byte”的结果python?
(对了,我用的是Python3)
Java Long class 的 parseLong() 方法用于将 CharSequence 参数解析为具有指定基数的带符号 long,从指定的 beginIndex 并扩展到 endIndex-1,通过观察方法签名,您会发现 parseLong 将 return long 并且它需要转换为 integer 如果你需要它作为 integer.
public static long parseLong(CharSequence s, int beginIndex, int endIndex, int radix)
(Integer)
、(int)
或通常 (T)
用于转换为所需的 class 类型。
Long.parseLong("11101101111110100111001110011010",2) = 3992613786
上一行采用字符串形式的二进制,并将二进制计算为一个 10 基数,然后将其赋值给一个 long 变量。
下面一行
(int)Long.parseLong("11101101111110100111001110011010",2)
只是将 long
变量中存在的赋值转换为 int
值。
请记住,这不是一个安全的操作,因为 long
变量由 8 个字节 的信息组成,并且能够在(-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)
的范围
另一方面,int
变量由 4 个字节 的信息组成,能够容纳 (-2,147,483,648 to 2,147,483,647)
[=21 范围内的数字=]
您可以使用以下内容来理解为什么这不安全
long a = Long.MAX_VALUE;
System.out.println(a); // Prints 9223372036854775807
int b = (int) a;
System.out.println(b); // Prints -1
最大的正 long 值当转换为 int
变量时,它变成负值 -1
最后,我用了gengkevhere的答案。
By playing around, I found something similar to BreizhGatch's function, but that doesn't require a conditional statement. n & 0x80000000 extracts the 32-bit sign bit; then, the - keeps the same 32-bit representation but sign-extends it; finally, the extended sign bits are set on n.
def toSigned32(n):
n = n & 0xffffffff
return n | (-(n & 0x80000000))
我正在尝试将一些 java 代码转换为 python。我对以下 java 行有疑问:
int toto = (int)Long.parseLong("11101101111110100111001110011010",2);
String result = Integer.reverseBytes(toto);
在 java 中,我得到了这些结果:
Long.parseLong("11101101111110100111001110011010",2) = 3992613786
(int)Long.parseLong("11101101111110100111001110011010",2) = -302353510
Integer.reverseBytes(toto) = -1703675155
我想我理解了第一行,但为什么这里有一个“(int)”?它应该做什么? (我是 java 和字节管理方面的初学者,我找不到关于这一点我理解的任何文档)。
在 python 中,我设法通过转换为基数 2 获得了第一个结果(我完全是偶然发现的):
int("11101101111110100111001110011010",2) = 3992613786
但是我怎样才能得到“int”的结果,然后得到“reverse byte”的结果python?
(对了,我用的是Python3)
Java Long class 的 parseLong() 方法用于将 CharSequence 参数解析为具有指定基数的带符号 long,从指定的 beginIndex 并扩展到 endIndex-1,通过观察方法签名,您会发现 parseLong 将 return long 并且它需要转换为 integer 如果你需要它作为 integer.
public static long parseLong(CharSequence s, int beginIndex, int endIndex, int radix)
(Integer)
、(int)
或通常 (T)
用于转换为所需的 class 类型。
Long.parseLong("11101101111110100111001110011010",2) = 3992613786
上一行采用字符串形式的二进制,并将二进制计算为一个 10 基数,然后将其赋值给一个 long 变量。
下面一行
(int)Long.parseLong("11101101111110100111001110011010",2)
只是将 long
变量中存在的赋值转换为 int
值。
请记住,这不是一个安全的操作,因为 long
变量由 8 个字节 的信息组成,并且能够在(-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)
另一方面,int
变量由 4 个字节 的信息组成,能够容纳 (-2,147,483,648 to 2,147,483,647)
[=21 范围内的数字=]
您可以使用以下内容来理解为什么这不安全
long a = Long.MAX_VALUE;
System.out.println(a); // Prints 9223372036854775807
int b = (int) a;
System.out.println(b); // Prints -1
最大的正 long 值当转换为 int
变量时,它变成负值 -1
最后,我用了gengkevhere的答案。
By playing around, I found something similar to BreizhGatch's function, but that doesn't require a conditional statement. n & 0x80000000 extracts the 32-bit sign bit; then, the - keeps the same 32-bit representation but sign-extends it; finally, the extended sign bits are set on n.
def toSigned32(n):
n = n & 0xffffffff
return n | (-(n & 0x80000000))