存储在单个整数python变量中的最大位

时间:2016-05-19 14:03:58

标签: python python-2.7 bit-manipulation

我正在解决一个问题,即如果MxN矩阵中的元素为0,则整个行和列都设置为0.

首先,引入两个变量 zero_row zero_col 来分别存储需要设置为0的行和列。接下来,我循环遍历矩阵中的元素,将zero_row中行的位偏移量设置为零,并将zero_col中列的位偏移量设置为1(如果元素等于0)。然后,我再次遍历矩阵并设置每个行和列如果在zero_row和zero_col中将位偏移设置为1,则为零。

zero_row和zero_col最初设置为0。所以我认为它是一个整数类型。我正在使用64位计算机。因此我认为我可以设置的最大位是64位(每个整数)。我很好奇为什么代码仍能正常使用3x144数组。列大小144位明显大于64位... Python会自动进行“类型转换”吗?或者也许任何人都可以指出我解释根本的文件。感谢。

import numpy

class Matrix:
    def __init__(self):
        pass

    def check_matrix(self, input_mat):
        zero_row = 0
        zero_col = 0
        for row in xrange(len(input_mat)):
            for col in xrange(len(input_mat[row])):
                if zero_row >> row & 1 == 0 or zero_col >> col & 1 == 0:
                    if input_mat[row][col] == 0:
                        zero_row = zero_row | 1 << row
                        zero_col = zero_col | 1 << col
        return [zero_row, zero_col]

    def set_matrix(self, input_mat, zero_row, zero_col):
        for row in xrange(len(input_mat)):
            for col in xrange(len(input_mat[row])):
                if (zero_row >> row) & 1 == 1 or (zero_col >> col) & 1 == 1:
                    input_mat[row][col] = 0        
        return input_mat


m = Matrix()
# input_arr = numpy.array([[1,1,1], [2, 0, 2], [3, 3, 3]])
# input_arr = numpy.array([[1,1,1], [2, 2, 2], [0, 3, 0]])
input_arr = numpy.array([
                     [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], 
                     [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2], 
                     [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,3,0]
                     ]) 
[zero_row, zero_col] = m.check_matrix(input_arr)
print bin(zero_row), " ", bin(zero_col) 
print m.set_matrix(input_arr, zero_row, zero_col)        

结果:

0b100    0b101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

[[ 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 11
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0  1  0]
 [ 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 11
   1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  0  2  0]
 [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0]]

1 个答案:

答案 0 :(得分:0)

看看documentation。 Python会自动将您的整数扩展到无限精度,因此如果您使用的是64位系统则无关紧要。