หลาม int กับสตริงไบนารี?


530

มีวิธี Python แบบใดแบบหนึ่งในการแปลงจำนวนเต็ม (หรือยาว) เป็นสตริงไบนารีใน Python หรือไม่?

มีฟังก์ชั่น dec2bin () มากมายบน Google ... แต่ฉันหวังว่าฉันจะสามารถใช้ฟังก์ชั่น / ไลบรารีในตัวได้


สำหรับการใช้เวลาตรงข้ามสำหรับขั้นตอนวิธีการประมวลผลสตริงบริสุทธิ์เห็นนี้
CopyPasteIt

คำตอบ:


750

วิธีการจัดรูปแบบสตริงของ Python สามารถระบุรูปแบบได้

>>> "{0:b}".format(37)
'100101'

จัดรูปแบบเอกสารข้อมูลจำเพาะสำหรับ Python 2

จัดรูปแบบเอกสารข้อมูลจำเพาะสำหรับ Python 3


86
str.format()เพียงแค่จัดรูปแบบหนึ่งค่ามากเกินไป ตรงไปที่format()ฟังก์ชั่นformat(n, 'b') : ไม่จำเป็นต้องแยกวิเคราะห์ตัวยึดตำแหน่งและจับคู่กับอาร์กิวเมนต์ให้ไปที่การดำเนินการจัดรูปแบบค่าโดยตรง ใช้เฉพาะstr.format()เมื่อคุณต้องการวางผลลัพธ์ที่จัดรูปแบบในสตริงที่ยาวขึ้น (เช่นใช้เป็นเทมเพลต)
Martijn Pieters

29
@ ไมค์: หรือใช้ข้อกำหนดการจัดรูปแบบ เพิ่มจำนวนหลักด้วย0สตริงที่นำไปสู่การจัดรูปแบบ: format(10, '016b')รูปแบบถึง 16 หลักพร้อมศูนย์นำ
Martijn Pieters

ในกรณีนี้0ใน"{0:b}"สามารถลดลงหรือไม่? ฉันหมายถึงในกรณีที่มีการจัดรูปแบบหมายเลขเดียวเท่านั้นมันถูกต้อง"{:b}"หรือไม่
tomasyany

1
โดยทั่วไปแล้วจะใช้การแทนค่าบิต 4/8 / ... :"{:08b}".format(37)
Sparkler

2
f "{37: b}" ใน Python3.7 หรือใหม่กว่า
DA

471

หากคุณกำลังมองหาbin()สิ่งที่เทียบเท่าhex()มันถูกเพิ่มใน python 2.6

ตัวอย่าง:

>>> bin(10)
'0b1010'

66
โปรดทราบว่ามันเร็วกว่าที่จะทำstr(bin(i))[2:](0.369 วินาทีสำหรับ 1000000ops) กว่า"{0:b}".format(i)(0.721s สำหรับ 1000000ops)
mVChr

64
@mVChr ถ้ามีใครบางคนแปลงตัวเลขให้เป็นตัวแทนไบนารี ASCII ฉันหวังว่าความเร็วจะไม่สำคัญ
นิค T

29
@mVChr: str.format()เป็นเครื่องมือที่ไม่ถูกต้องอยู่แล้วคุณจะใช้format(i, 'b')แทน พิจารณาว่ายังให้ตัวเลือกการเสริมและการจัดตำแหน่งของคุณด้วย; format(i, '016b')เพื่อจัดรูปแบบเป็นเลขฐานสองแบบศูนย์บิต 16 บิต หากต้องการทำสิ่งเดียวกันกับที่bin()คุณต้องเพิ่มstr.zfill()สาย: bin(i)[2:].zfill(16)(ไม่จำเป็นต้องโทรstr()!) format()ความสามารถในการอ่านและความยืดหยุ่น (การจัดรูปแบบไดนามิกนั้นยากกว่ามากbin()) เป็นการแลกเปลี่ยนที่ยอดเยี่ยมอย่าปรับประสิทธิภาพให้เหมาะสมเว้นแต่คุณจะต้องดำเนินการจนกว่าจะปรับให้เหมาะสมเพื่อการบำรุงรักษา
Martijn Pieters

[2:] หมายความว่าอย่างไร
zero_cool

4
แน่นอนด้วย python 3.6+ คุณสามารถใช้งานf"{37:b}"ได้แล้ว
ลุคเดวิส

63

งูหลามจริงจะมีสิ่งที่สร้างขึ้นแล้วในนี้ความสามารถในการที่จะดำเนินการเช่น'{0:b}'.format(42)ซึ่งจะทำให้คุณรูปแบบบิต (ในสตริง) สำหรับหรือ42101010


สำหรับปรัชญาทั่วไปไม่มีภาษาหรือไลบรารีใดที่จะให้ทุกสิ่งที่ผู้ใช้ต้องการ หากคุณกำลังทำงานในสภาพแวดล้อมที่ไม่ได้ให้สิ่งที่คุณต้องการอย่างแน่นอนคุณควรรวบรวมตัวอย่างโค้ดในขณะที่คุณพัฒนาเพื่อให้แน่ใจว่าคุณไม่ต้องเขียนสิ่งเดียวกันสองครั้ง เช่น 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

ซึ่งจะสร้างสตริงไบนารีของคุณตามค่าทศนิยม เพียงจำไว้ว่ามันเป็นรหัสหลอกๆทั่วไปซึ่งอาจไม่มากที่สุดวิธีที่มีประสิทธิภาพในการทำมันแม้ว่ามีการทำซ้ำที่คุณดูเหมือนจะเสนอก็จะไม่สร้างความแตกต่างมาก มันจริงๆเพียงแค่ความหมายเป็นแนวทางในวิธีการที่จะสามารถทำได้

แนวคิดทั่วไปคือการใช้รหัสจาก (ตามลำดับการตั้งค่า):

  • ภาษาหรือไลบรารีในตัว
  • ห้องสมุดบุคคลที่สามที่มีใบอนุญาตที่เหมาะสม
  • คอลเลกชันของคุณเอง
  • สิ่งใหม่ที่คุณต้องเขียน (และบันทึกในคอลเล็กชันของคุณเองในภายหลัง)

1
คำแนะนำที่ดีในคำตอบนี้ เพียงเลวร้ายเกินไปว่ารหัสช้าไม่มีความจำเป็น คุณเสนออัลโก (N ^ 2) อัลโกที่จะทำ O (N) ส่วนที่มีปัญหาอยู่ในs = "1" + sและs = "0" + sบรรทัด แต่ละอันทำให้สำเนาที่ไม่จำเป็นของ s คุณควรย้อนกลับสตริงก่อนที่คุณจะส่งคืนแทน
Andreas Magnusson

@Andreas สิ่งที่ฉันเสนอคือการใช้'{0:b}'.format(42)วิธีการที่ช้าเป็นเพียงตัวอย่างของวิธีการทำโดยทั่วไปซึ่งอาจจะใช่หรือไม่ใช่ O (n ^ 2) ขึ้นอยู่กับภาษาที่ใช้จริง ดูเหมือนว่า Python เท่านั้นเนื่องจาก Python เป็นภาษารหัสหลอกในอุดมคติดังนั้นฉันจะเปลี่ยนเพื่อให้ชัดเจน
paxdiablo

ที่จริงแล้วมันเป็นภาษาที่ค่อนข้างลึกลับซึ่งs = "1" + sไม่ได้เป็น O (N) เมื่อsเป็นประเภทสตริง บางทีภาษาที่เก็บสตริงทั้งหมดไว้ข้างหลังหรือถ่านแต่ละตัวเป็นโหนดในรายการที่ลิงก์? สำหรับภาษาทั่วไปใด ๆ สตริงนั้นเป็นอาร์เรย์ของตัวอักษร ในกรณีที่คำนำหน้าสตริงต้องการให้มีการทำสำเนาคุณจะใส่อักขระต่อหน้าตัวละครอื่นอย่างไร
Andreas Magnusson

ฉันสามารถมองเห็นประเภทสตริงที่ประกอบด้วยบล็อกของหน่วยความจำได้อย่างง่ายดายโดยที่สตริงนั้นมีความถูกต้องเหมาะสมภายในบล็อกนั้นและชดเชยกับอักขระเริ่มต้น หากต้องการนำหน้าอักขระคุณจะต้องลดออฟเซ็ตและเก็บอักขระไว้ที่นั่น ใช่มันเป็นเรื่องลึกลับ แต่ก็ไม่มีเหตุผลที่ฉันจะเถียงกับปัญหาโลกแห่งความจริงที่เป็นไปได้ด้วยการใช้โค้ดหลอกโดยเฉพาะอย่างยิ่งเนื่องจากคุณไม่น่าจะมีบิตมากกว่าหนึ่งโหล / ซ้ำ แม้การเรียงฟองที่ผิดพลาดก็เพียงพอหากขนาดข้อมูลของคุณมีขนาดเล็ก :-) ไม่ว่าในกรณีใดฉันจะเพิ่มบันทึกเกี่ยวกับประสิทธิภาพ
paxdiablo

แน่นอนถ้าประสิทธิภาพเป็นสิ่งสำคัญคุณอาจไม่ได้เลือกไพ ธ อนเพื่อเริ่มต้น ในประสบการณ์ของฉันมันเกิดขึ้นค่อนข้างบ่อยรหัสที่เขียนอย่างไร้เดียงสาโดยใช้ O (N²) และทดสอบกับชุดข้อมูลขนาดเล็กอย่างรวดเร็วถูกใช้กับชุดข้อมูลที่ใหญ่กว่าเพราะ "ดูเหมือนว่าจะทำงาน" ทันใดนั้นคุณมีรหัสที่ใช้เวลาหลายชั่วโมงในการรันเมื่อแก้ไขอาจใช้เวลาเพียงไม่กี่วินาที O (N²) algos เป็นร้ายกาจเพราะพวกเขาดูเหมือนจะทำงานในขณะที่ แต่เมื่อข้อมูลของคุณปรับขนาดพวกเขาทำไม่ได้และจากนั้นคนที่เขียนพวกเขาได้เลิกและไม่มีใครรู้ว่าทำไมสิ่งที่ใช้ตลอดไป
Andreas Magnusson

41

หากคุณต้องการการแสดงข้อความโดยไม่มี 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)

5
format(integer, 'b')หรือการใช้งานเพียงแค่ bin()เป็นเครื่องมือแก้จุดบกพร่องที่มุ่งเน้นเฉพาะการผลิตหลามไบนารีจำนวนเต็มอักษรไวยากรณ์ , format()จะหมายถึงการผลิตรูปแบบที่เฉพาะเจาะจง
Martijn Pieters

1
@MartijnPieters ขอบคุณมากที่พูดถึงมัน ฉันปรับวิธีแก้ปัญหาของฉันแล้ว คุณจะรู้ได้อย่างไรว่าbin()เป็นเครื่องมือในการดีบักที่มีจุดประสงค์เพื่อสร้างไวยากรณ์ตัวอักษรไบนารีของ Python ฉันไม่พบสิ่งนั้นในเอกสารประกอบ
Martin Thoma

2
จากเอกสาร: ผลที่ได้คือการแสดงออกของงูหลามที่ถูกต้อง มันมีจุดมุ่งหมายคือการสร้างการแสดงออกของงูหลามไม่ใช่การสร้างตัวแทนผู้ใช้ปลายทาง เช่นเดียวกับและoct() hex()
Martijn Pieters

4
ทางเลือกอื่น ๆ : หากคุณกำลังจะทำให้แบบไดนามิกกว้างแทนstr.zfill()คุณสามารถใช้str.format()หรือformat()มีอาร์กิวเมนต์ที่สองแบบไดนามิก: หรือ'{0:0{1}b}'.format(x, n) format(b, '0{}b'.format(n))
Martijn Pieters

@MartijnPieters ว้าวขอบคุณมากสำหรับข้อมูลนี้! ฉันไม่รู้ว่ามันเป็นไปได้ในรูปแบบ อย่างไรก็ตามฉันคิดว่าคำตอบปัจจุบันของฉันกับzfillอ่านและทำความเข้าใจง่ายกว่าอาร์กิวเมนต์ที่สองแบบไดนามิกดังนั้นฉันจะเก็บไว้
มาร์ติน Thoma

38

เป็นข้อมูลอ้างอิง:

def toBinary(n):
    return ''.join(str(1 & int(n) >> i) for i in range(64)[::-1])

ฟังก์ชั่นนี้สามารถแปลงเป็นจำนวนเต็มบวกมีขนาดใหญ่เป็นตัวแทนเป็นสตริง18446744073709551615'1111111111111111111111111111111111111111111111111111111111111111'

มันสามารถปรับเปลี่ยนการให้บริการเป็นจำนวนเต็มขนาดใหญ่มากถึงแม้ว่ามันอาจจะไม่สะดวกเท่าหรือ"{0:b}".format()bin()


@GarethDavidson รุ่นนี้คืออะไร? การระบุสิ่งนี้ไว้อย่างชัดเจนอาจนำไปใช้ในอนาคตได้มากขึ้นเมื่อ googling
Wolf

ฉันคิดว่าเป็นรุ่น 2.7 ฉันสงสัยว่ามันจะทำงานใน 3.x
Gareth Davidson

17

วิธีง่ายๆในการทำเช่นนั้นคือการใช้รูปแบบสตริงดูหน้านี้

>> "{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 คือความกว้างของสตริงไบนารี


16

นี่สำหรับหลาม 3 และมันยังคงเป็นศูนย์นำหน้า!

print(format(0, '08b'))

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันขอขอบคุณคำตอบง่ายๆ
reergymerej

14

หนึ่งซับด้วยแลมบ์ดา :

>>> 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 จะเป็น '0' หรือไม่
dietbacon

หากคุณต้องการที่จะเห็นว่า 0 :) คุณสามารถแทนที่''ด้วย'0'แต่มันจะเพิ่ม 0 นำสำหรับหมายเลขใด ๆ
Aziz Alto

11

สรุปทางเลือก:

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


6
str.format()เพียงแค่จัดรูปแบบหนึ่งค่ามากเกินไป ตรงไปที่ฟังก์ชั่น:format() format(n, 'b')ไม่จำเป็นต้องแยกวิเคราะห์ตัวยึดตำแหน่งและจับคู่กับอาร์กิวเมนต์ด้วยวิธีนั้น
Martijn Pieters

10

เนื่องจากคำตอบก่อนหน้านี้ส่วนใหญ่จะใช้รูปแบบ () นี่คือการใช้งาน 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



5

ใช้แพ็ค / 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)

คำถามเกี่ยวกับการเป็นตัวแทนสตริง ถึงกระนั้นนี่ก็เป็นเพียงสิ่งที่ฉันกำลังมองหาโดยไม่ต้องผ่านสายอักขระก่อน! :)
Tom Hale

doco says: องค์ประกอบ unpacks ของuint8อาร์เรย์เป็นไบนารีมูลค่าอาร์เรย์เอาท์พุท ดีสำหรับค่ามากถึง 255
Tom Hale

5

สำหรับพวกเราที่ต้องการแปลงจำนวนเต็ม (ช่วง -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'

4

เว้นแต่ว่าฉันเข้าใจผิดว่าคุณหมายถึงอะไรโดยสตริงไบนารี่ฉันคิดว่าโมดูลที่คุณกำลังมองหาคือstruct


สถานที่ตั้งใหม่
อลัน

4

อีกวิธีหนึ่งที่มีอัลกอริทึมอื่นโดยใช้ตัวดำเนินการระดับบิต

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 

รุ่นที่สองนั้นไม่เร็วอย่างแน่นอนเมื่อคุณจบลงด้วยอัลกอริทึม O (N ^ 2) แทน O (N) ฉันได้เห็นสิ่งต่าง ๆ เช่นนี้ฆ่าแอปพลิเคชัน (ประสิทธิภาพที่ฉลาด) เพราะนักพัฒนาคิดว่าการทำพาสพิเศษในตอนท้ายนั้นช้ากว่าการทำบางสิ่งเพิ่มเติมในลูปแรก เมื่อแก้ไขแล้วจะทำให้เวลาทำงานลดลงจากวันเป็นวินาที
Andreas Magnusson

4
def binary(decimal) :
    otherBase = ""
    while decimal != 0 :
        otherBase  =  str(decimal % 2) + otherBase
        decimal    //=  2
    return otherBase

print binary(10)

เอาท์พุท:

1010



3

นี่คือรหัสที่ฉันเพิ่งใช้งาน นี่ไม่ใช่วิธีการแต่คุณสามารถใช้เป็นฟังก์ชั่นพร้อมใช้งานได้ !

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

3

นี่คือวิธีแก้ปัญหาอย่างง่าย ๆ โดยใช้ divmod () fucntion ซึ่งส่งคืนการเตือนและผลลัพธ์ของการหารโดยไม่มีเศษส่วน

def dectobin(number):
    bin = ''
    while (number >= 1):
        number, rem = divmod(number, 2)
        bin = bin + str(rem)
    return bin

ต้องการการดีบัก การโทรdectobin(10)ส่งผลให้ '0101'
เนท


3

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'

2

วิธีการแก้ปัญหาที่คล้ายกันค่อนข้าง

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 

2

นี่เป็นอีกวิธีหนึ่งในการใช้คณิตศาสตร์ปกติไม่มีลูปเรียกซ้ำเท่านั้น (กรณีเล็กน้อย 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']

2

เครื่องคิดเลขพร้อมฟังก์ชั่นที่จำเป็นสำหรับ 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')

2

วิธีคำนวณเลขฐานสอง:

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

1

หากคุณยินดีที่จะยอมแพ้ Python "บริสุทธิ์" แต่ได้รับอาวุธมากมายSage - ตัวอย่างที่นี่ :

sage: a = 15
sage: a.binary()
'1111'

คุณจะทราบว่ามันส่งคืนเป็นสตริงดังนั้นหากต้องการใช้เป็นหมายเลขที่คุณต้องการทำเช่นนั้น

sage: eval('0b'+b)
15

1
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")

6
อาจต้องการเพิ่มคำอธิบายให้กับสิ่งที่คุณทำ
อาร์ทเลส

1

ฉันพบวิธีการที่ใช้การดำเนินการเมทริกซ์ในการแปลงทศนิยมเป็นไบนารี

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


0

นี่คือไบนารีตัวแปลงทศนิยมแบบธรรมดาที่วนซ้ำอย่างต่อเนื่อง

t = 1
while t > 0:
    binaryNumber = input("Enter a binary No.")
    convertedNumber = int(binaryNumber, 2)

    print(convertedNumber)

print("")

นี่คือลำดับย้อนกลับของสิ่งที่ OP ต้องการ พวกเขากำลังมองหา int ถึงไบนารี คุณให้ไบนารีกับ int
เซซิเลีย

0

นี่คือคำตอบของฉันมันทำงานได้ดี .. !

def binary(value) :
    binary_value = ''
    while value !=1  :
        binary_value += str(value%2)
        value = value//2
    return '1'+binary_value[::-1]

เกิดอะไรขึ้นถ้าคุณส่งผ่านค่า0? เช่นbinary(0)คุณจะได้รับสิ่งที่คุณคาดหวัง?
Andreas Magnusson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.