代码之家  ›  专栏  ›  技术社区  ›  crazyy_photonn

Python和Java中的位操作

  •  3
  • crazyy_photonn  · 技术社区  · 7 年前

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

    “给定一个非空整数数组,每个元素出现三次,只有一个元素出现一次。找到那只。”

    例如:

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

    我试图用位操作来解决这个问题,我在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中的位操作有什么不同吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   REDDY PRASAD Mortana    7 年前

    Java有32位固定的int大小。但在python中,数字没有显式定义的限制。读入 Maximum value for long integer )

    对于你的问题,一个老套的解决方案是

    return ans - 2**(32-1)