Python 和 Java 中的位操作

Posted

技术标签:

【中文标题】Python 和 Java 中的位操作【英文标题】:Bit Manipulation in Python and Java 【发布时间】:2018-06-12 13:57:29 【问题描述】:

我正在解决一个问题,其中给定的数组如下:

" 给定一个非空整数数组,每个元素都出现 3 次,只有一个元素只出现一次。找到那个唯一的元素。"

例如:

Input: [2,2,3,2]
Output: 3

我正在尝试使用 Bit Manipulation 来解决它,我在 Python 中的代码如下:

def singleNumber(self, nums):

    ans = 0
    for i in range(31):
        summ = 0
        for num in nums:
            dig = (num>>i)&1
            if dig:
                summ += 1
        summ = summ%3
        if summ:
            ans = ans | summ<<i

    return ans

我要做的就是,获取数组中每个数字的最后一位并计算我得到的数字的数量,然后 %3 以获得剩余的确切 1 位并将其移位以得出正确的答案.

这会导致有负输入的测试用例失败,例如:

[-2,-2,1,1,-3,1,-3,-3,-4,-2]
O/P: 2147483644
Expected O/P: -4

但是,当我在 Java 中执行完全相同的操作时,它可以工作!代码如下:

class Solution 
public int singleNumber(int[] nums) 

    int ans = 0;
    int dig = 0;

    for(int i = 0; i <=31; i++)
        int sum = 0;
        for(int num: nums)

            dig = (num>>i)&1;
            if(dig!=0)
                sum = sum + 1;    
            
            sum = sum%3;
        
        if(sum!= 0)
            ans = ans | sum<<i;
        

    
    return(ans);
   

导致这种差异的位在 Python 中是如何表示的? 有人能告诉我 Python 和 Java 这两种语言在位操作方面的区别吗?

【问题讨论】:

***.com/questions/35578435/… 可能会有所帮助 【参考方案1】:

java 具有 32 位固定 int 大小。但是在python中没有明确定义的数字限制。阅读(Maximum value for long integer)

针对您的问题的 hacky 解决方案(可能不适用于所有情况)是

return ans - 2**(32-1)

【讨论】:

以上是关于Python 和 Java 中的位操作的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的位运算和使用举例

加快 Python 中的位串/位操作?

java中的位操作移位操作

JAVA进阶之路-java中的位操作

Java中负字节和短数据类型中的位操作

Java中的位运算