มีวิธี Python แบบใดแบบหนึ่งในการแปลงจำนวนเต็ม (หรือยาว) เป็นสตริงไบนารีใน Python หรือไม่?
มีฟังก์ชั่น dec2bin () มากมายบน Google ... แต่ฉันหวังว่าฉันจะสามารถใช้ฟังก์ชั่น / ไลบรารีในตัวได้
มีวิธี Python แบบใดแบบหนึ่งในการแปลงจำนวนเต็ม (หรือยาว) เป็นสตริงไบนารีใน Python หรือไม่?
มีฟังก์ชั่น dec2bin () มากมายบน Google ... แต่ฉันหวังว่าฉันจะสามารถใช้ฟังก์ชั่น / ไลบรารีในตัวได้
คำตอบ:
วิธีการจัดรูปแบบสตริงของ Python สามารถระบุรูปแบบได้
>>> "{0:b}".format(37)
'100101'
str.format()
เพียงแค่จัดรูปแบบหนึ่งค่ามากเกินไป ตรงไปที่format()
ฟังก์ชั่นformat(n, 'b')
: ไม่จำเป็นต้องแยกวิเคราะห์ตัวยึดตำแหน่งและจับคู่กับอาร์กิวเมนต์ให้ไปที่การดำเนินการจัดรูปแบบค่าโดยตรง ใช้เฉพาะstr.format()
เมื่อคุณต้องการวางผลลัพธ์ที่จัดรูปแบบในสตริงที่ยาวขึ้น (เช่นใช้เป็นเทมเพลต)
0
สตริงที่นำไปสู่การจัดรูปแบบ: format(10, '016b')
รูปแบบถึง 16 หลักพร้อมศูนย์นำ
0
ใน"{0:b}"
สามารถลดลงหรือไม่? ฉันหมายถึงในกรณีที่มีการจัดรูปแบบหมายเลขเดียวเท่านั้นมันถูกต้อง"{:b}"
หรือไม่
"{:08b}".format(37)
str(bin(i))[2:]
(0.369 วินาทีสำหรับ 1000000ops) กว่า"{0:b}".format(i)
(0.721s สำหรับ 1000000ops)
str.format()
เป็นเครื่องมือที่ไม่ถูกต้องอยู่แล้วคุณจะใช้format(i, 'b')
แทน พิจารณาว่ายังให้ตัวเลือกการเสริมและการจัดตำแหน่งของคุณด้วย; format(i, '016b')
เพื่อจัดรูปแบบเป็นเลขฐานสองแบบศูนย์บิต 16 บิต หากต้องการทำสิ่งเดียวกันกับที่bin()
คุณต้องเพิ่มstr.zfill()
สาย: bin(i)[2:].zfill(16)
(ไม่จำเป็นต้องโทรstr()
!) format()
ความสามารถในการอ่านและความยืดหยุ่น (การจัดรูปแบบไดนามิกนั้นยากกว่ามากbin()
) เป็นการแลกเปลี่ยนที่ยอดเยี่ยมอย่าปรับประสิทธิภาพให้เหมาะสมเว้นแต่คุณจะต้องดำเนินการจนกว่าจะปรับให้เหมาะสมเพื่อการบำรุงรักษา
f"{37:b}"
ได้แล้ว
งูหลามจริงจะมีสิ่งที่สร้างขึ้นแล้วในนี้ความสามารถในการที่จะดำเนินการเช่น'{0:b}'.format(42)
ซึ่งจะทำให้คุณรูปแบบบิต (ในสตริง) สำหรับหรือ42
101010
สำหรับปรัชญาทั่วไปไม่มีภาษาหรือไลบรารีใดที่จะให้ทุกสิ่งที่ผู้ใช้ต้องการ หากคุณกำลังทำงานในสภาพแวดล้อมที่ไม่ได้ให้สิ่งที่คุณต้องการอย่างแน่นอนคุณควรรวบรวมตัวอย่างโค้ดในขณะที่คุณพัฒนาเพื่อให้แน่ใจว่าคุณไม่ต้องเขียนสิ่งเดียวกันสองครั้ง เช่น pseudo-code:
define intToBinString, receiving intVal:
if intVal is equal to zero:
return "0"
set strVal to ""
while intVal is greater than zero:
if intVal is odd:
prefix "1" to strVal
else:
prefix "0" to strVal
divide intVal by two, rounding down
return strVal
ซึ่งจะสร้างสตริงไบนารีของคุณตามค่าทศนิยม เพียงจำไว้ว่ามันเป็นรหัสหลอกๆทั่วไปซึ่งอาจไม่มากที่สุดวิธีที่มีประสิทธิภาพในการทำมันแม้ว่ามีการทำซ้ำที่คุณดูเหมือนจะเสนอก็จะไม่สร้างความแตกต่างมาก มันจริงๆเพียงแค่ความหมายเป็นแนวทางในวิธีการที่จะสามารถทำได้
แนวคิดทั่วไปคือการใช้รหัสจาก (ตามลำดับการตั้งค่า):
s = "1" + s
และs = "0" + s
บรรทัด แต่ละอันทำให้สำเนาที่ไม่จำเป็นของ s คุณควรย้อนกลับสตริงก่อนที่คุณจะส่งคืนแทน
'{0:b}'.format(42)
วิธีการที่ช้าเป็นเพียงตัวอย่างของวิธีการทำโดยทั่วไปซึ่งอาจจะใช่หรือไม่ใช่ O (n ^ 2) ขึ้นอยู่กับภาษาที่ใช้จริง ดูเหมือนว่า Python เท่านั้นเนื่องจาก Python เป็นภาษารหัสหลอกในอุดมคติดังนั้นฉันจะเปลี่ยนเพื่อให้ชัดเจน
s = "1" + s
ไม่ได้เป็น O (N) เมื่อs
เป็นประเภทสตริง บางทีภาษาที่เก็บสตริงทั้งหมดไว้ข้างหลังหรือถ่านแต่ละตัวเป็นโหนดในรายการที่ลิงก์? สำหรับภาษาทั่วไปใด ๆ สตริงนั้นเป็นอาร์เรย์ของตัวอักษร ในกรณีที่คำนำหน้าสตริงต้องการให้มีการทำสำเนาคุณจะใส่อักขระต่อหน้าตัวละครอื่นอย่างไร
หากคุณต้องการการแสดงข้อความโดยไม่มี 0b-prefix คุณสามารถใช้สิ่งนี้:
get_bin = lambda x: format(x, 'b')
print(get_bin(3))
>>> '11'
print(get_bin(-3))
>>> '-11'
เมื่อคุณต้องการตัวแทน n-bit:
get_bin = lambda x, n: format(x, 'b').zfill(n)
>>> get_bin(12, 32)
'00000000000000000000000000001100'
>>> get_bin(-12, 32)
'-00000000000000000000000000001100'
หรือหากคุณต้องการฟังก์ชั่น:
def get_bin(x, n=0):
"""
Get the binary representation of x.
Parameters
----------
x : int
n : int
Minimum number of digits. If x needs less digits in binary, the rest
is filled with zeros.
Returns
-------
str
"""
return format(x, 'b').zfill(n)
format(integer, 'b')
หรือการใช้งานเพียงแค่ bin()
เป็นเครื่องมือแก้จุดบกพร่องที่มุ่งเน้นเฉพาะการผลิตหลามไบนารีจำนวนเต็มอักษรไวยากรณ์ , format()
จะหมายถึงการผลิตรูปแบบที่เฉพาะเจาะจง
bin()
เป็นเครื่องมือในการดีบักที่มีจุดประสงค์เพื่อสร้างไวยากรณ์ตัวอักษรไบนารีของ Python ฉันไม่พบสิ่งนั้นในเอกสารประกอบ
oct()
hex()
str.zfill()
คุณสามารถใช้str.format()
หรือformat()
มีอาร์กิวเมนต์ที่สองแบบไดนามิก: หรือ'{0:0{1}b}'.format(x, n)
format(b, '0{}b'.format(n))
zfill
อ่านและทำความเข้าใจง่ายกว่าอาร์กิวเมนต์ที่สองแบบไดนามิกดังนั้นฉันจะเก็บไว้
เป็นข้อมูลอ้างอิง:
def toBinary(n):
return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])
ฟังก์ชั่นนี้สามารถแปลงเป็นจำนวนเต็มบวกมีขนาดใหญ่เป็นตัวแทนเป็นสตริง18446744073709551615
'1111111111111111111111111111111111111111111111111111111111111111'
มันสามารถปรับเปลี่ยนการให้บริการเป็นจำนวนเต็มขนาดใหญ่มากถึงแม้ว่ามันอาจจะไม่สะดวกเท่าหรือ"{0:b}".format()
bin()
วิธีง่ายๆในการทำเช่นนั้นคือการใช้รูปแบบสตริงดูหน้านี้
>> "{0:b}".format(10)
'1010'
และถ้าคุณต้องการมีความยาวคงที่ของสตริงไบนารีคุณสามารถใช้สิ่งนี้:
>> "{0:{fill}8b}".format(10, fill='0')
'00001010'
หากต้องการส่วนประกอบสองรายการสามารถใช้บรรทัดต่อไปนี้:
'{0:{fill}{width}b}'.format((x + 2**n) % 2**n, fill='0', width=n)
โดยที่ n คือความกว้างของสตริงไบนารี
หนึ่งซับด้วยแลมบ์ดา :
>>> binary = lambda n: '' if n==0 else binary(n/2) + str(n%2)
ทดสอบ:
>>> binary(5)
'101'
แก้ไข :
แต่แล้ว :(
t1 = time()
for i in range(1000000):
binary(i)
t2 = time()
print(t2 - t1)
# 6.57236599922
ในการเปรียบเทียบกับ
t1 = time()
for i in range(1000000):
'{0:b}'.format(i)
t2 = time()
print(t2 - t1)
# 0.68017411232
''
ด้วย'0'
แต่มันจะเพิ่ม 0 นำสำหรับหมายเลขใด ๆ
สรุปทางเลือก:
n=42
assert "-101010" == format(-n, 'b')
assert "-101010" == "{0:b}".format(-n)
assert "-101010" == (lambda x: x >= 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:])(-n)
assert "0b101010" == bin(n)
assert "101010" == bin(n)[2:] # But this won't work for negative numbers.
ร่วมให้ข้อมูล ได้แก่จอห์น Fouhy , ทุ่งเหงียน , mVChr , มาร์ติน Thoma และ Martijn Pieters
str.format()
เพียงแค่จัดรูปแบบหนึ่งค่ามากเกินไป ตรงไปที่ฟังก์ชั่น:format()
format(n, 'b')
ไม่จำเป็นต้องแยกวิเคราะห์ตัวยึดตำแหน่งและจับคู่กับอาร์กิวเมนต์ด้วยวิธีนั้น
เนื่องจากคำตอบก่อนหน้านี้ส่วนใหญ่จะใช้รูปแบบ () นี่คือการใช้งาน f-string
integer = 7
bit_count = 5
print(f'{integer:0{bit_count}b}')
เอาท์พุท:
00111
เพื่อความสะดวกของที่นี่คือการเชื่อมโยงหลามเอกสารสำหรับการจัดรูปแบบตัวอักษรของสตริง: https://docs.python.org/3/reference/lexical_analysis.html#f-strings
>>> format(123, 'b')
'1111011'
ใช้แพ็ค / unpackbits พวกเขาเป็นเพื่อนที่ดีที่สุดของคุณ
Examples
--------
>>> a = np.array([[2], [7], [23]], dtype=np.uint8)
>>> a
array([[ 2],
[ 7],
[23]], dtype=uint8)
>>> b = np.unpackbits(a, axis=1)
>>> b
array([[0, 0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)
สำหรับพวกเราที่ต้องการแปลงจำนวนเต็ม (ช่วง -2 ** (หลัก -1)) เป็น 2 ** (หลัก -1) -1) เป็น 2 สายอักขระเลขฐานสองส่วนนี้ใช้งานได้:
def int2bin(integer, digits):
if integer >= 0:
return bin(integer)[2:].zfill(digits)
else:
return bin(2**digits + integer)[2:]
สิ่งนี้ผลิต:
>>> int2bin(10, 8)
'00001010'
>>> int2bin(-10, 8)
'11110110'
>>> int2bin(-128, 8)
'10000000'
>>> int2bin(127, 8)
'01111111'
อีกวิธีหนึ่งที่มีอัลกอริทึมอื่นโดยใช้ตัวดำเนินการระดับบิต
def int2bin(val):
res=''
while val>0:
res += str(val&1)
val=val>>1 # val=val/2
return res[::-1] # reverse the string
รุ่นที่เร็วกว่าโดยไม่ต้องย้อนกลับสตริง
def int2bin(val):
res=''
while val>0:
res = chr((val&1) + 0x30) + res
val=val>>1
return res
def binary(decimal) :
otherBase = ""
while decimal != 0 :
otherBase = str(decimal % 2) + otherBase
decimal //= 2
return otherBase
print binary(10)
เอาท์พุท:
1010
คุณสามารถทำเช่นนั้นได้:
bin(10)[2:]
หรือ :
f = str(bin(10))
c = []
c.append("".join(map(int, f[2:])))
print c
นี่คือรหัสที่ฉันเพิ่งใช้งาน นี่ไม่ใช่วิธีการแต่คุณสามารถใช้เป็นฟังก์ชั่นพร้อมใช้งานได้ !
def inttobinary(number):
if number == 0:
return str(0)
result =""
while (number != 0):
remainder = number%2
number = number/2
result += str(remainder)
return result[::-1] # to invert the string
นี่คือวิธีแก้ปัญหาอย่างง่าย ๆ โดยใช้ divmod () fucntion ซึ่งส่งคืนการเตือนและผลลัพธ์ของการหารโดยไม่มีเศษส่วน
def dectobin(number):
bin = ''
while (number >= 1):
number, rem = divmod(number, 2)
bin = bin + str(rem)
return bin
dectobin(10)
ส่งผลให้ '0101'
n=input()
print(bin(n).replace("0b", ""))
numpy.binary_repr(num, width=None)
ตัวอย่างจากลิงค์เอกสารด้านบน:
>>> np.binary_repr(3) '11' >>> np.binary_repr(-3) '-11' >>> np.binary_repr(3, width=4) '0011'
ส่วนประกอบทั้งสองจะถูกส่งกลับเมื่อหมายเลขอินพุตเป็นลบและระบุความกว้าง:
>>> np.binary_repr(-3, width=3) '101' >>> np.binary_repr(-3, width=5) '11101'
วิธีการแก้ปัญหาที่คล้ายกันค่อนข้าง
def to_bin(dec):
flag = True
bin_str = ''
while flag:
remainder = dec % 2
quotient = dec / 2
if quotient == 0:
flag = False
bin_str += str(remainder)
dec = quotient
bin_str = bin_str[::-1] # reverse the string
return bin_str
นี่เป็นอีกวิธีหนึ่งในการใช้คณิตศาสตร์ปกติไม่มีลูปเรียกซ้ำเท่านั้น (กรณีเล็กน้อย 0 ไม่มีอะไรส่งคืน)
def toBin(num):
if num == 0:
return ""
return toBin(num//2) + str(num%2)
print ([(toBin(i)) for i in range(10)])
['', '1', '10', '11', '100', '101', '110', '111', '1000', '1001']
เครื่องคิดเลขพร้อมฟังก์ชั่นที่จำเป็นสำหรับ DEC, BIN, HEX: (ผลิตและทดสอบด้วย Python 3.5)
คุณสามารถเปลี่ยนหมายเลขทดสอบการป้อนข้อมูลและรับการแปลง
# CONVERTER: DEC / BIN / HEX
def dec2bin(d):
# dec -> bin
b = bin(d)
return b
def dec2hex(d):
# dec -> hex
h = hex(d)
return h
def bin2dec(b):
# bin -> dec
bin_numb="{0:b}".format(b)
d = eval(bin_numb)
return d,bin_numb
def bin2hex(b):
# bin -> hex
h = hex(b)
return h
def hex2dec(h):
# hex -> dec
d = int(h)
return d
def hex2bin(h):
# hex -> bin
b = bin(h)
return b
## TESTING NUMBERS
numb_dec = 99
numb_bin = 0b0111
numb_hex = 0xFF
## CALCULATIONS
res_dec2bin = dec2bin(numb_dec)
res_dec2hex = dec2hex(numb_dec)
res_bin2dec,bin_numb = bin2dec(numb_bin)
res_bin2hex = bin2hex(numb_bin)
res_hex2dec = hex2dec(numb_hex)
res_hex2bin = hex2bin(numb_hex)
## PRINTING
print('------- DECIMAL to BIN / HEX -------\n')
print('decimal:',numb_dec,'\nbin: ',res_dec2bin,'\nhex: ',res_dec2hex,'\n')
print('------- BINARY to DEC / HEX -------\n')
print('binary: ',bin_numb,'\ndec: ',numb_bin,'\nhex: ',res_bin2hex,'\n')
print('----- HEXADECIMAL to BIN / HEX -----\n')
print('hexadec:',hex(numb_hex),'\nbin: ',res_hex2bin,'\ndec: ',res_hex2dec,'\n')
วิธีคำนวณเลขฐานสอง:
print("Binary is {0:>08b}".format(16))
วิธีคำนวณเลขฐานสิบหก Hexa ของตัวเลข :
print("Hexa Decimal is {0:>0x}".format(15))
การคำนวณไบนารีทั้งหมดจนถึง 16 ::
for i in range(17):
print("{0:>2}: binary is {0:>08b}".format(i))
ในการคำนวณเลขฐานสิบหก Hexa จนถึง 17
for i in range(17):
print("{0:>2}: Hexa Decimal is {0:>0x}".format(i))
##as 2 digit is enogh for hexa decimal representation of a number
หากคุณยินดีที่จะยอมแพ้ Python "บริสุทธิ์" แต่ได้รับอาวุธมากมายSage - ตัวอย่างที่นี่ :
sage: a = 15
sage: a.binary()
'1111'
คุณจะทราบว่ามันส่งคืนเป็นสตริงดังนั้นหากต้องการใช้เป็นหมายเลขที่คุณต้องการทำเช่นนั้น
sage: eval('0b'+b)
15
try:
while True:
p = ""
a = input()
while a != 0:
l = a % 2
b = a - l
a = b / 2
p = str(l) + p
print(p)
except:
print ("write 1 number")
ฉันพบวิธีการที่ใช้การดำเนินการเมทริกซ์ในการแปลงทศนิยมเป็นไบนารี
import numpy as np
E_mat = np.tile(E,[1,M])
M_order = pow(2,(M-1-np.array(range(M)))).T
bindata = np.remainder(np.floor(E_mat /M_order).astype(np.int),2)
E
คือข้อมูลทศนิยมอินพุตM
คือคำสั่งฐานสอง bindata
คือเอาต์พุตข้อมูลไบนารีซึ่งอยู่ในรูปแบบ 1 โดยเมทริกซ์ไบนารี M
นี่คือไบนารีตัวแปลงทศนิยมแบบธรรมดาที่วนซ้ำอย่างต่อเนื่อง
t = 1
while t > 0:
binaryNumber = input("Enter a binary No.")
convertedNumber = int(binaryNumber, 2)
print(convertedNumber)
print("")
นี่คือคำตอบของฉันมันทำงานได้ดี .. !
def binary(value) :
binary_value = ''
while value !=1 :
binary_value += str(value%2)
value = value//2
return '1'+binary_value[::-1]
0
? เช่นbinary(0)
คุณจะได้รับสิ่งที่คุณคาดหวัง?