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öntemi
str.format()
, Yerleşik İşlevlerformat()
, f dizesi - Negatif bir tamsayıyı, ikiye tümleyen biçiminde bir dizeye dönüştürün.
- yerleşik işlev (örneğin programlama dilinde)
- İ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()
- yerleşik işlev (örneğin programlama dilinde)
- 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:
0b
veya0B
- Sekizli:
0o
veya0O
- Onaltılık sayı:
0x
veya0X
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öntemi
str.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
- bin() — Built-in Functions — Python 3.10.0 Documentation
- oct() — Built-in Functions — Python 3.10.0 Documentation
- hex() — Built-in Functions — Python 3.10.0 Documentation
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:
0b
veya0B
- Sekizlik önek:
0o
veya0O
- Onaltılık önek:
0x
veya0X
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