この関数はパラメータとして整数を受け取り、ビットのリストとしてバイナリで表された同じ値を表すリストを返す必要があります。リストの最初の要素は最上位(左端)のビットです。
私の関数は現在、数値11に対して'1011'
を出力しますが、代わりに[1,0,1,1]
が必要です。
例えば、
>>> convert_to_binary(11)
[1,0,1,1]
def trans(x):
if x == 0: return [0]
bit = []
while x:
bit.append(x % 2)
x >>= 1
return bit[::-1]
楽しみのために-再帰的なワンライナーとしてのソリューション:
def tobin(x):
return tobin(x/2) + [x%2] if x > 1 else [x]
私はこれを提案してもいいですか:
def tobin(x,s):
return [(x>>k)&1 for k in range(0,s)]
それはおそらく最速の方法であり、私にはかなり明白に思えます。パフォーマンスが重要な場合、ビンウェイは遅すぎます。
乾杯
これはそれを行います。組み込みがある場合、独自の関数をロールする意味はありません。
_def binary(x):
return [int(i) for i in bin(x)[2:]]
_
bin()
関数は、バイナリの文字列に変換されます。 _0b
_を削除すると、設定が完了します。
numpy パッケージを使用して、非常に高速なソリューションを取得できます。
python -m timeit -s "import numpy as np; x=np.array([8], dtype=np.uint8)" "np.unpackbits(x)"
1000000 loops, best of 3: 0.65 usec per loop
python -m timeit "[int(x) for x in list('{0:0b}'.format(8))]"
100000 loops, best of 3: 3.68 usec per loop
unpackbitsはuint8タイプの入力のみを処理しますが、np.viewを引き続き使用できます。
python -m timeit -s "import numpy as np; x=np.array([124567], dtype=np.uint64).view(np.uint8)" "np.unpackbits(x)"
1000000 loops, best of 3: 0.697 usec per loop
最初にformat関数を使用して、現在の関数のようなバイナリ文字列を取得できます。たとえば、次のスニペットは、整数58に対応する8ビットのバイナリ文字列を作成します。
>>>u = format(58, "08b")
'00111010'
次に、文字列を繰り返して各ビットをintに変換し、整数としてエンコードされたビットの目的のリストを取得します。
>>>[int(d) for d in u]
[0, 0, 1, 1, 1, 0, 1, 0]
これが私が大学のために作ったもののコードです。クリック コードのYouTubeビデオはこちら ! https://www.youtube.com/watch?v=SGTZzJ5H-CE
__author__ = 'Derek'
print('Int to binary')
intStr = input('Give me an int: ')
myInt = int(intStr)
binStr = ''
while myInt > 0:
binStr = str(myInt % 2) + binStr
myInt //= 2
print('The binary of', intStr, 'is', binStr)
print('\nBinary to int')
binStr = input('Give me a binary string: ')
temp = binStr
newInt = 0
power = 0
while len(temp) > 0: # While the length of the array if greater than zero keep looping through
bit = int(temp[-1]) # bit is were you temporally store the converted binary number before adding it to the total
newInt = newInt + bit * 2 ** power # newInt is the total, Each time it loops it adds bit to newInt.
temp = temp[:-1] # this moves you to the next item in the string.
power += 1 # adds one to the power each time.
print("The binary number " + binStr, 'as an integer is', newInt)
実際には最も効率的ではありませんが、少なくともそれを理解するための簡単な概念的な方法を提供します...
1)1に達するまで、フロアですべての数値を2で繰り返し除算します。
2)逆の順序で、この数値の配列のビットを作成します。偶数の場合は0を追加し、奇数の場合は1を追加します。
これが文字通りの実装です。
def intToBin(n):
nums = [n]
while n > 1:
n = n // 2
nums.append(n)
bits = []
for i in nums:
bits.append(str(0 if i%2 == 0 else 1))
bits.reverse()
print ''.join(bits)
これは、メモリをより有効に活用するバージョンです。
def intToBin(n):
bits = []
bits.append(str(0 if n%2 == 0 else 1))
while n > 1:
n = n // 2
bits.append(str(0 if n%2 == 0 else 1))
bits.reverse()
return ''.join(bits)
Pythonの方法ではありません...しかしそれでも機能します:
def get_binary_list_from_decimal(integer, bits):
'''Return a list of 0's and 1's representing a decimal type integer.
Keyword arguments:
integer -- decimal type number.
bits -- number of bits to represent the integer.
Usage example:
#Convert 3 to a binary list
get_binary_list_from_decimal(3, 4)
#Return will be [0, 0, 1, 1]
'''
#Validate bits parameter.
if 2**bits <= integer:
raise ValueError("Error: Number of bits is not sufficient to \
represent the integer. Increase bits parameter.")
#Initialise binary list
binary_list = []
remainder = integer
for i in range(bits-1, -1, -1):
#If current bit value is less than or equal to the remainder of
#the integer then bit value is 1.
if 2**i <= remainder:
binary_list.append(1)
#Subtract the current bit value from the integer.
remainder = remainder - 2**i
else:
binary_list.append(0)
return binary_list
使用方法の例:
get_binary_list_from_decimal(1, 3)
#Return will be [0, 0, 1]
10進数を2進数に変換することは、%と//をどのように使用するかによって異なります。
def getbin(num):
if (num==0):
k=[0]
return k
else:
s = []
while(num):
s.append(num%2)
num=num//2
return s
def nToKBit(n, K=64):
output = [0]*K
def loop(n, i):
if n == 0:
return output
output[-i] = n & 1
return loop(n >> 1, i+1)
return loop(n, 1)
Intの配列を処理する関数を共有するだけです。
def to_binary_string(x):
length = len(bin(max(x))[2:])
for i in x:
b = bin(i)[2:].zfill(length)
yield [int(n) for n in b]
テスト:
x1 = to_binary_string([1, 2, 3])
x2 = to_binary_string([1, 2, 3, 4])
print(list(x1)) # [[0, 1], [1, 0], [1, 1]]
print(list(x2)) # [[0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0]]
ほとんどの場合、2進数を特定の長さにする必要があります。たとえば、1を8桁の2進数の長さにしたいとします[0,0,0,0,0,0,0,1]。私はこれを自分で使用します:
def convert_to_binary(num, length=8):
binary_string_list = list(format(num, '0{}b'.format(length)))
return [int(digit) for digit in binary_string_list]