Python’da ikili, sekizli ve onaltılık sayıları ve dizeleri birbirine ve birbirinden dönüştürün

Python, sayıları ve dizgileri ikili, sekizli ve onaltılı sayıların yanı sıra olağan ondalık sayılar olarak işleyebilir. Aralarında dönüştürmek de kolaydır.

Bu bölümde, aşağıdaki içerikler örnek kod ile birlikte açıklanacaktır.

  • Tam sayıları ikili, sekizli ve onaltılı olarak yazın.
  • Sayıları ikili, sekizli ve onaltılık gösterimde dizelere dönüştürün.
    • yerleşik işlev (örneğin programlama dilinde)bin(),oct(),hex()
    • dize yöntemistr.format(), Yerleşik İşlevlerformat(), f dizesi
    • Negatif bir tamsayıyı, ikiye tümleyen biçiminde bir dizeye dönüştürün.
  • İkili, sekizli ve onaltılık gösterimdeki dizeleri sayılara dönüştürün.
    • yerleşik işlev (örneğin programlama dilinde)int()
  • Uygulama örnekleri
    • İkili dizi aritmetiği
    • İkili, sekizli ve onaltılı sayılar arasında dönüştürme

Tam sayıları ikili, sekizli ve onaltılı olarak yazın.

Aşağıdaki önekleri ekleyerek, tamsayı int sayıları sırasıyla ikili, sekizli ve onaltılı olarak yazılabilir.
Büyük harf de kullanabilirsiniz.

  • İkili numara:0bveya0B
  • Sekizli:0oveya0O
  • Onaltılık sayı:0xveya0X

print() çıktısı ondalık gösterimde olacaktır.

bin_num = 0b10
oct_num = 0o10
hex_num = 0x10

print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16

Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10

print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16

Önekle bile, tür bir int tamsayıdır.

print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>

print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>

Tamsayı türü olduğu için normal aritmetik işlemler için kullanılabilir.

result = 0b10 * 0o10 + 0x10
print(result)
# 32

Python 3.6 ile başlayarak, sayılara alt çizgi _ eklemek mümkündür. Alt çizgiyi tekrarlamak bir hataya neden olur, ancak tekrar etmediğiniz sürece istediğiniz kadar ekleyebilirsiniz.

_ alt çizgi sayıyı etkilemez, bu nedenle çok sayıda basamak olduğunda ayırıcı olarak kullanılabilir. Örneğin, her dört basamakta bir alt çizgi _ eklemek, okunması kolaydır.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Sayıları ikili, sekizli ve onaltılık gösterimde dizelere dönüştürün.

Bir sayıyı ikili, sekizli veya onaltılık gösterimde bir dizeye dönüştürmek için aşağıdaki yerleşik işlevleri kullanın.

  • yerleşik işlev (örneğin programlama dilinde)bin(),oct(),hex()
  • dize yöntemistr.format(), Yerleşik İşlevlerformat(), f dizesi

Bu bölüm ayrıca, negatif değerler için ikinin tümleyen biçiminde ifade edilen bir dizenin nasıl elde edileceğini de açıklar.

Yerleşik işlevler bin(), oct(), hex()

Aşağıdaki yerleşik işlevler, sayıları ikili, sekizli ve onaltılı dizelere dönüştürebilir.

  • İkili numara:bin()
  • Sekizli:oct()
  • Onaltılık sayı:hex()

Her biri aşağıdaki öneklere sahip bir dize döndürür

  • İkili numara:0b
  • Sekizli:0o
  • Onaltılık sayı:0x
i = 255

print(bin(i))
print(oct(i))
print(hex(i))
# 0b11111111
# 0o377
# 0xff

print(type(bin(i)))
print(type(oct(i)))
print(type(hex(i)))
# <class 'str'>
# <class 'str'>
# <class 'str'>

Ön eke ihtiyacınız yoksa, arkasındaki dizeyi çıkarmak için dilim[2:]’yi veya aşağıda açıklandığı gibi format()’ı kullanın.

print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff

Onu bir ondalık dizgeye dönüştürmek istiyorsanız, str() kullanabilirsiniz.

print(str(i))
# 255

print(type(str(i)))
# <class 'str'>

Yerleşik işlev biçimi(), dize yöntemi str.format(), f dizesi

Yerleşik format() işlevi ve str.format() ve f-string dize yöntemleri de sayıları ikili, sekizli ve onaltılı dizelere dönüştürebilir.

format() öğesinin ikinci argümanını aşağıdaki gibi belirterek, sırasıyla ikili, sekizli ve onaltılı dizelere dönüştürülebilir.

  • İkili numara:b
  • Sekizli:o
  • Onaltılık sayı:x
print(format(i, 'b'))
print(format(i, 'o'))
print(format(i, 'x'))
# 11111111
# 377
# ff

print(type(format(i, 'b')))
print(type(format(i, 'o')))
print(type(format(i, 'x')))
# <class 'str'>
# <class 'str'>
# <class 'str'>

0b,0o,0x önekine sahip bir dize almak istiyorsanız, biçimlendirme belirtimi dizesine # ekleyin.

print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff

0’ı herhangi bir sayıda basamakla doldurmak da mümkündür. Önek için karakter sayısının (iki karakter) bir önekle sıfır doldurulurken de dikkate alınması gerektiğini unutmayın.

print(format(i, '08b'))
print(format(i, '08o'))
print(format(i, '08x'))
# 11111111
# 00000377
# 000000ff

print(format(i, '#010b'))
print(format(i, '#010o'))
print(format(i, '#010x'))
# 0b11111111
# 0o00000377
# 0x000000ff

str.format() dize yöntemi de dönüştürme için kullanılabilir.

print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff

Python 3.6 ile başlayarak f dizesini de kullanabilirsiniz.f'xxx'

print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff

Negatif bir tamsayıyı, ikiye tümleyen biçiminde bir dizeye dönüştürün.

Negatif bir tamsayı bin() veya format() kullanılarak ikili veya onaltılık bir dizeye dönüştürüldüğünde, mutlak değer bir eksi işaretine sahip olacaktır.

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

Python’da, negatif tamsayılar üzerinde bitsel işlemler de ikinin tümleyen temsilinde gerçekleştirilir. Bu nedenle, ikinin tümleyen biçiminde ifade edilen bir dize elde etmek istiyorsanız, bit düzeyinde mantıksal OR& gereken maksimum bit basamak sayısı aşağıdaki gibidir.

  • 4bit:0b1111(=0xf)
  • 8bit:0xff
  • 16bit:0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

İkili, sekizli ve onaltılık gösterimdeki dizeleri sayılara dönüştürün.

Yerleşik işlev int()

İkili, sekizli veya onaltılı gösterimdeki bir dizeyi sayıya dönüştürmek için yerleşik int() işlevini kullanın.

int(string, radix) ile, ikili, sekizli, onaltılık gösterimde, vb. bir dize dizesi, sayı tabanına dayalı bir sayısal int’ye dönüştürülebilir. Taban atlanırsa, sayı ondalık olarak kabul edilir.

print(int('10'))
print(int('10', 2))
print(int('10', 8))
print(int('10', 16))
# 10
# 2
# 8
# 16

print(type(int('10')))
print(type(int('10', 2)))
print(type(int('10', 8)))
print(type(int('10', 16)))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>

Taban 0 olarak ayarlanırsa, dönüştürme aşağıdaki dize önekine göre yapılır.

  • İkili önek:0bveya0B
  • Sekizlik önek:0oveya0O
  • Onaltılık önek:0xveya0X
print(int('0b10', 0))
print(int('0o10', 0))
print(int('0x10', 0))
# 2
# 8
# 16

print(int('0B10', 0))
print(int('0O10', 0))
print(int('0X10', 0))
# 2
# 8
# 16

Temel sayı 0 ise ve ön ek yoksa, ondalık sayı olarak dönüştürülecektir, ancak başlangıç ​​(sol taraf) 0 ile doldurulursa bir hata oluşacağını unutmayın.

print(int('10', 0))
# 10

# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'

Diğer durumlarda, sıfır doldurulmuş dizeler olduğu gibi dönüştürülebilir.

print(int('010'))
# 10

print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255

Dize belirtilen sayı tabanı veya önekle dönüştürülemiyorsa bir hata oluşur.

# print(int('ff', 2))
# ValueError: invalid literal for int() with base 2: 'ff'

# print(int('0a10', 0))
# ValueError: invalid literal for int() with base 0: '0a10'

# print(int('0bff', 0))
# ValueError: invalid literal for int() with base 0: '0bff'

Uygulama örnekleri

İkili dizi aritmetiği

Örneğin, 0b öneki ile ikili gösterimde bir dize üzerinde bir işlem gerçekleştirmek için.

Kolayca sayısal bir değere (int tamsayı türü) dönüştürebilir, üzerinde işlemler gerçekleştirebilir ve ardından tekrar str dizesine dönüştürebilirsiniz.

a = '0b1001'
b = '0b0011'

c = int(a, 0) + int(b, 0)

print(c)
print(bin(c))
# 12
# 0b1100

İkili, sekizli ve onaltılı sayılar arasında dönüştürme

İkili, sekizli ve onaltılı dizeleri birbirine dönüştürmek de kolaydır. Sayısal bir int’ye dönüştürüldükten sonra, herhangi bir biçimdeki bir dizeye dönüştürülebilir.

Sıfır doldurma, ön ek vb. biçimlendirme belirtimi dizesi tarafından kontrol edilebilir.

a_0b = '0b1110001010011'

print(format(int(a, 0), '#010x'))
# 0x00000009

print(format(int(a, 0), '#010o'))
# 0o00000011
Copied title and URL