Sayı tabanı dönüştürücü

Bir sayıyı ikilik, sekizlik, onluk, on altılık ve 2–36 arası bir taban arasında dönüştürür; sabit genişlikli ikiye tümleyen ve tıklanabilir bit ızgarası.

Genişlik
İkilik
Sekizlik
Onluk
On altılık
Taban
Bitler — çevirmek için tıklayın

8 bit genişlik, 8 ayarlı

Bu araç ne yapar

Aynı sayı birçok tabanda yazılabilir ve programcılar sürekli dördü arasında geçiş yapar: ikilik, çünkü donanımın tuttuğu şey odur; on altılık, çünkü ikiliğin okunabilir bir kısaltmasıdır; onluk, çünkü insanlar öyle düşünür; ve sekizlik, çünkü dosya izinleri ve birkaç eski sistem hâlâ onu kullanır. Buradaki alanlardan herhangi birine bir değer yazın, geri kalanı izlesin; ayrıca 2 ile 36 arasında herhangi bir tabana ayarlayabileceğiniz bir alan daha.

Bunu bir okul hesap makinesinden ayıran şey, genişlik seçici ve bit ızgarasıdır. 8, 16, 32 ya da 64 bit seçin, negatif sayılar bir eksi işareti yerine gerçek makine gösterimlerini alsın ve her bit tıklayabileceğiniz bir şey olsun.

Bir taban gerçekte nedir

Bir taban, tükenip elde götürmeden önce kaç basamağınız olduğudur. Onlukta on vardır, bu yüzden 9’dan sonra 10 gelir. İkilikte iki vardır, bu yüzden 1’den sonra 10 gelir. Her basamağın konumu tabanın bir kuvvetidir ve hepsi bundan ibarettir:

1011           # the number, in base 2
1 x 8 = 8      # bit 3
0 x 4 = 0      # bit 2
1 x 2 = 2      # bit 1
1 x 1 = 1      # bit 0
8+0+2+1 = 11   # the total, in decimal

Ondan büyük tabanlar ondan çok basamak simgesine gerek duyar, bu yüzden harfleri ödünç alırlar: on altılık 0-9 sonra a-f gider, orada a 10’dur ve f 15’tir. Bu, her basamağı ve her harfi kullanan 36 tabanına kadar sürer — düz alfabeyle yazabileceğiniz en büyük taban ve bu aracın orada durmasının nedeni.

Neden on altılık, başka bir şey değil

Hex tek belirli bir nedenle popülerdir: 16, 2’nin 4. kuvvetidir; bu yüzden tam olarak bir hex basamağı tam olarak dört biti kapsar. Bu, hex ile ikilik arasındaki dönüşümü aritmetiksiz bir aramaya dönüştürür — her hex basamağı, çevresindeki basamaklardan bağımsız olarak kendi dört bitine açılır.

d    e    a    d
1101 1110 1010 1101   # each hex digit is its own nibble

Sekizlik, 8, 2’nin 3. kuvveti olduğu için, basamak başına üç bitle aynı şekilde çalışır — Unix izinlerinin sekizlik olmasının nedeni budur: kullanıcı grubu başına üç izin biti tam olarak bir basamağa sığar. Onluğun ikilikle böyle bir ilişkisi yoktur; aralarında dönüştürmenin bir arama yerine gerçek bölme gerektirmesinin nedeni budur.

Buradaki ikilik alanın dörderli, hex alanın ikişerli gruplanmasının nedeni de budur: gruplar, önemli olan sınırlarla hizalanır; böylece bir nibble’ı ya da bir baytı saymadan ekrandan okuyabilirsiniz.

Negatif sayılar ve ikiye tümleyen

Bir negatif sayının tek başına ikilik biçimi yoktur. Bir yazmaçta eksi işareti yoktur — yalnızca bitler — bu yüzden işaretin bitlerin kendisinde kodlanması gerekir ve bu, kaç bit olduğuna karar vermeyi gerektirir. Genişlik seçicinin var olmasının ve onu değiştirdiğinizde yanıtın değişmesinin nedeni budur.

Her modern makinenin kullandığı şema ikiye tümleyendir: bir negatif sayıyı temsil etmek için, pozitif biçimini alın, her biti ters çevirin ve bir ekleyin. Sonuç, en üst bitin «negatif» anlamına gelmesi ve sıradan toplamanın işaretler için hiçbir özel durum olmadan çalışmaya devam etmesidir.

0000 0101   # 5
1111 1010   # every bit inverted
1111 1011   # plus one: -5 as a byte, or fb in hex

Yazmacı genişletin, aynı sayı farklı bir desen alsın: -5, 8 bitte fb, 16 bitte fffb ve 32 bitte fffffffb’dir. Değer değişmedi; onu taşıyan bit sayısı değişti. Bu araçta genişliği değiştirmek tam olarak bunu gösterir.

0xFF neden hem 255 hem −1

ff bitleri işaretli olup olmadıklarını söylemez. 1111 1111 tutan bir bayt, onu yükleyen kod işaretsiz bir tür bildirdiyse 255, işaretli bir tür bildirdiyse −1 olarak okunur. Baytın kendisinde ikisini ayırt eden hiçbir şey yoktur — tür, böyle bir bilgi taşımayan bitler hakkında programın öne sürdüğü bir iddiadır.

Bu, tüm bir gerçek hata ailesinin kaynağıdır: negatif çıkan bir sağlama toplamı, bir dosyadan okunan ve sıfırdan küçük karşılaştırılan bir bayt, işaretliliği uygulamaya bağlı tanımlı olduğu için ARM’de x86’dan farklı davranan bir C char’ı. İşaretli ve işaretsiz okumalar farklı olduğunda, bu araç ikisini de gösterir, çünkü uyumsuzluk genellikle aradığınız şeydir.

Bit ızgarası

Geçerli değerin her biti konum numarasıyla gösterilir ve birine tıklamak onu çevirir. Tabanlar hemen güncellenir; bu, birkaç soruyu elle olduğundan çok daha kolay yanıtlanır kılar:

  • Bu bayrak değerinde hangi bit ayarlı — aralarında tıklayın ve konumları okuyun.
  • 4 ve 7 bitleri için maske ne — o ikisini ayarlayın ve hex’i okuyun.
  • En üst biti ayarlamak işaretli bir değere ne yapar — onu görünür biçimde negatif yapar.
  • Bu değer ikinin kuvveti mi — ikinin kuvvetinin tam olarak bir biti ayarlıdır.

Bit 0, en az anlamlı bittir ve sağda durur; bu evrensel kuraldır ve ızgaranın sağdan sola bir sayfada bile soldan sağa kalmasının nedenidir. Satırlar sekiz bit genişliğindedir; böylece bayt sınırları bir bakışta görünür.

Büyük sayılar tam kalır

JavaScript sayıları double’dır; tam sayıları yalnızca 2^53’e kadar — yaklaşık 9 katrilyon — tam tutar. 64 bitlik bir değer bunu aşabilir ve sıradan sayılar üzerine kurulu bir dönüştürücü onu sessizce yuvarlar, makul görünen ve son basamaklarında yanlış olan bir hex dizesi verir.

Buradaki her şey bunun yerine keyfi kesinlikli tam sayılar kullanır; böylece tam bir 64 bitlik değer tam olarak dönüşür. Keyfi kesinlik genişlik modu daha da ileri gider ve sınırı tümüyle kaldırır — kriptografik değerler ve büyük tanımlayıcılar için yararlıdır — ama unutmayın ki sabit bir genişlik olmadan ikiye tümleyen yoktur; bu yüzden o moddaki bir negatif sayı her tabanda yalnızca bir eksi işareti taşır.

İkilikten onluğa, onluktan ikiliğe

İkilik ile onluk, burada hiçbir ortak yanı olmayan tek çifttir: iki, onun kuvveti değildir; on da ikinin kuvveti değildir. Bu yüzden iki yönden hiçbiri bir arama değildir ve ikisi de gerçek aritmetik ister. Üstelik aynı aritmetik de değildir — bir yöndeki hızlı elle yöntem, dönüş yönündeki hızlı elle yöntemin tersi değildir.

  • İkilikten onluğa, ikiye katlayarak: en soldaki bitte sıfırdan başlayın, sonra her bit için elinizdekini ikiye katlayıp o biti ekleyin. 1011 için bu 1, 2, 5, 11 diye gider — tek geçiş, ezberlenecek basamak değeri yok ve bu araç yazdığınızı okurken tam olarak bunu yapar.
  • İkilikten onluğa, konumlarla: ayarlı her bitin basamak değerini toplayın; yukarıdaki çözümlü örnek budur. Yalnızca iki ya da üç bit ayarlıyken hızlı, çoğu ayarlıyken yavaştır.
  • Onluktan ikiliğe, bölerek: ikiye bölüp kalanı yazın, hiçbir şey kalmayana dek tekrar tekrar; sonra kalanları aşağıdan yukarıya okuyun. Yanıt en az anlamlı bit önce gelir; bu yüzden yazdığınız süre boyunca ters görünür.
  • Onluktan ikiliğe, çıkararak: sığan en büyük ikinin kuvvetini çıkarın ve yineleyin. 200, 128 kaybeder ve 72 kalır; 72, 64 kaybeder ve 8 kalır; 8, 8 kaybeder ve hiçbir şey kalmaz — yani 7, 6 ve 3 konumlarındaki bitler ayarlıdır ve bayt 1100 1000 olur. Ayarlı bit az olduğunda bölmekten hızlıdır.

Buradaki hiçbir elle yöntemin kapsamadığı bir şey var: negatif bir onluk sayının, bir genişlik seçilene dek hiçbir ikilik biçimi yoktur. İkilikte eksi beş isteyin, dürüst yanıt bir sorudur — kaç bit? Genişlik seçicinin çözdüğü şey tam olarak budur ve yukarıdaki ikiye tümleyen bölümünün konusu da budur. Keyfi kesinlik modunda genişlik yoktur; bu yüzden eksi işareti her tabana sayıyla birlikte gelir.

Onluktan on altılığa, on altılıktan onluğa

Bunu sık yapan neredeyse kimse on altıya bölmez. Kısayol, on altılığın ikilikle ilişkisidir: onluk sayıyı bir kez ikiliğe çevirin, bitleri sağdan başlayarak dörderli gruplara ayırın ve her grubu tek bir hex basamağı olarak okuyun. Dönüş, aynı yolun tersidir — her hex basamağını kendi dört bitine açın, sonra ayarlı bitlerin basamak değerlerini toplayın. Bir bayta sığan her şey için daha da kısa bir yol var: birinci hex basamağı ikincinin on altı katıdır, yani çarpıp toplayın.

  • 255, ff eder — her biti ayarlı bir bayt. Ezberlemeye değen budur, çünkü bayt orada biter.
  • 256, 100 eder. Dolu bir baytın bir adım ötesinde basamaklar devrilir, tıpkı onlukta 99’un 100’e devrilmesi gibi ve on altılık sayı, baytın taşıyamayacağı bir basamak kazanır.
  • 65535, ffff eder ve 65536, 10000 eder: bir bayt yukarıdaki aynı iki işaret ve on altı bitlik bir sayacın bittiği yer.
  • 4096, 1000 eder; sayfa boyutları, hizalamalar ve bellekteki kaymalar bu yüzden hex’te yuvarlak, onlukta tırtıklı görünür. Hex dörderli bit sayar, donanım da öyle.

Büyük ve küçük harf ayrımı yoktur: FF ile ff aynı değerdir; araç girişte ikisini de kabul eder ve çıkışta küçük harf yazar. Yapmayacağı şey tahmindir. 0x öneki on altılık alana aittir ve onluk alanda sessizce atılmak yerine geri çevrilir, çünkü yanlış tabanda okunan bir değer, bir dönüştürücünün asla makul göstermemesi gereken tek hatadır.

Sekizlikten onluğa ve yanıtı değiştiren baştaki sıfır

Sekizlik bir yerde her yerden çok yaşar: dosya izinlerinde; orada kullanıcı grubu başına üç izin biti tam olarak bir sekizlik basamağa sığar. Onluğa çevirmek, sekizin kuvvetleriyle yapılan sıradan konum aritmetiğidir — sekizlik 755, yedi tane altmış dört artı beş tane sekiz artı beştir, yani 493 — ve ters yön, kalanları aşağıdan yukarıya okunan sekize bölmedir; onluktan ikiliğe geçişle aynı biçim ve aynı nedenle: sekizin de onla bir ilişkisi yoktur.

  • 755, onlukta 493’tür; 644, 420’dir; 777, 511’dir. Bu onluk sayıların hiçbiri kimsenin işine yaramaz ve asıl nokta budur — izinler sekizlik yazılır, çünkü basamaklar izin bitleriyle hizalanır, değer bir şey saydığı için değil.
  • Baştaki sıfır, C ve Python 2 dillerinde bir taban imidir: orada 0755 sekizliktir, yani 493 sayısıdır. Python 3 bu yazımı büsbütün geri çevirir ve yerine 0o755 ister; bu da sessiz hataların bütün bir ailesini ortadan kaldırdı.
  • YAML 1.1 de tırnaksız bir 0755’i 493 olarak okur — bu yüzden bir yapılandırma dosyasındaki izin kipi tırnak içine alınmalıdır, yoksa yazdığınız kip olmaktan çıkar.
  • JSON buna hiçbir zaman izin vermedi: dilbilgisi bir sayının başında sıfırı yasaklar, bu yüzden 0755 orada sayı bile değildir, bir ayrıştırma hatasıdır — üç davranışın en gürültülüsü ve yanlış okunması olanaksız olan tekidir.

Bu araç baştaki sıfırı hiçbir şeyin imi saymaz. Tabanı, yazdığınız alan belirler: 0755, onluk alanda 755’tir ve sekizlik alanda 493’tür; 0o öneki sekizlik alanda kabul edilir ve başka her yerde geri çevrilir. Tabanı bir önekten tahmin etmek, yazılandan başka bir sayı döndürmek olurdu.

Sekizlikten on altılığa: kısayolu olmayan çift

İkisi de ikinin kuvvetidir, yani ikisi de aynı bitlerin yeniden gruplanmasından ibarettir — yine de bu, dört taban arasında basamak basamak kuralı hiç olmayan tek çifttir. Bir sekizlik basamak üç bittir, bir hex basamağı dörttür ve iki sayıdan hiçbiri ötekini bölmez; bu yüzden sınırlar asla hizalanmaz. Bitleri yazıp yeniden gruplamaktan kaçış yoktur.

  • Her sekizlik basamağı sırayla kendi üç bitiyle yazın: 755, 111 101 101 olur.
  • Bu bitleri sağ uçtan başlayarak dörderli yeniden gruplayın; sayı tam bölünmediğinde solu sıfırlarla doldurun: 0001 1110 1101.
  • Her dörtlüyü tek bir hex basamağı olarak okuyun: 1ed. Yanlış uçtan doldurmak buradaki klasik hatadır ve yanlış görünmez — yanıtı sessizce katlar.

İki hex basamağının tam olarak bir bayt etmesi ve iki sekizlik basamağın etmemesi, belleği okurken hex’in sekizliğin yerini almasının bütün nedenidir: sekiz bit, iki sekizlik basamak ile üçte ikidir; bu yüzden bayt sınırı bir basamağın ortasına düşer. Sekizlik, söz uzunluğu üç bitin katı olan makinelere uyuyordu; hex sekiz bitlik bayta uyar. Ve bu sayfada bu çift için bit ızgarası her iki elle yöntemden de hızlıdır — bitleri bir kez ayarlayın, iki alan zaten yanıtı gösteriyor.

Sıkça sorulan sorular

−5 neden ikilikte −101 yerine fb olarak görünüyor?
Çünkü bir yazmaçta eksi işareti yoktur. Bir genişlik seçildiğinde, negatif sayılar makinenin gerçekte sakladığı şey olan ikiye tümleyende gösterilir: bir bayttaki −5, 1111 1011 ya da fb’dir. İşaretli matematiksel biçimi istiyorsanız, genişliği keyfi kesinliğe geçirin.
0xFF, 255 mi −1 mi?
İkisi de — bitler aynıdır ve yalnızca bildirilen tür karar verir. İşaretli 8 bitlik bir değer ff’yi −1 olarak okur; işaretsiz bir değer onu 255 olarak okur. İki okuma farklı olduğunda, bu araç onları yan yana gösterir.
Neden onluk yerine bu kadar çok on altılık kullanılıyor?
Çünkü bir hex basamağı tam olarak dört bittir; böylece hex ve ikilik aritmetiksiz bir aramayla dönüşür ve basamaklar bayt sınırlarıyla hizalanır. Onluğun ikilikle böyle bir ilişkisi yoktur; bu yüzden onluk bir değer hangi bitlerin ayarlı olduğu hakkında size hiçbir şey söylemez.
Buradaki en yüksek taban nedir ve neden 36?
36, çünkü bu 10 basamak artı 26 harf — düz Latin alfabesinin sunduğu her simge. Daha yükseğe çıkmak, hangi fazladan karakterlerin kullanılacağına dair bir kural gerektirirdi ve üzerinde anlaşılmış tek bir tane yoktur.
İçinde 0x ya da boşluklar olan bir değer yapıştırabilir miyim?
Evet. 0x, 0b ve 0o önekleri eşleşen tabanlarında kabul edilir ve boşluklar ile alt çizgiler yok sayılır; böylece önce temizlemeden doğrudan koddan ya da bir veri sayfasından yapıştırabilirsiniz.
64 bitlik bir değer tam olarak dönüşür mü?
Evet. Tüm aritmetik keyfi kesinlikli tam sayılar kullanır; böylece 2^53’ün ötesindeki — sıradan bir JavaScript sayısının yuvarlamaya başladığı — değerler tam kalır.
Yazdığım herhangi bir şey bir sunucuya gönderiliyor mu?
Hayır. Bu, tarayıcınızda aritmetiktir; hiçbir şey yüklenmez ya da günlüğe yazılmaz ve ağ bağlantısı olmadan çalışır.
İkilik bir sayıyı elle onluğa nasıl çeviririm?
Soldan başlayarak ikiye katlayıp ekleyin: sıfırdan başlayın ve her bit için o ana dek elinizdekini ikiye katlayıp biti ekleyin. 1011, 1, sonra 2, sonra 5, sonra 11 diye gider. Tek geçiştir, ezberlenecek basamak değeri yoktur ve aynı yöntem her tabanda işler — ikiye katlamak yerine tabanla çarpın.
255 on altılıkta kaçtır ve bu sayı neden sürekli karşımıza çıkar?
ff. Sekiz bitinin tümü ayarlı bir bayttır, yani bir baytın tuttuğu en büyük değer ve sayımın ikinci bayta devrildiği noktadır — renk kanallarında, maskelerde ve boyut sınırlarında her yerde bu yüzden görünür. Bir fazlası 256’dır ve hex’te 100 yazılır.
0755 ile 755 aynı sayı mı?
Burada onluk alanda evet, sekizlik alanda hayır: tabanı alan belirler ve baştaki sıfır yalnızca bir sıfır basamağıdır. Başka yerlerde dile bağlıdır — C ve Python 2, 0755’i sekizlik, yani 493 olarak okur; Python 3 bu yazımı geri çevirip 0o755 ister; YAML 1.1 onu 493 olarak okur; JSON ise sözdizimi hatası sayar.
Sekizliği on altılığa nasıl çeviririm?
İkilik üzerinden, çünkü daha kısa bir yol yok: sekizlik basamak başına üç bit, hex basamağı başına dört bit ve ikisi asla hizalanmaz. Her sekizlik basamağı kendi üç bitine açın, tüm diziyi sağdan başlayarak dörderli yeniden gruplayın ve her dörtlüyü hex basamağı olarak okuyun — 755, 111 101 101 olur, sonra 0001 1110 1101, sonra 1ed.

İlgili araçlar

  • Bayt boyutu dönüştürücü

    Aynı sayı, bit deseni olarak değil bir veri miktarı olarak okunduğunda: o sayfa bayt sayısını KB, MB, GB ve yanlarında KiB, MiB, GiB olarak verir, iki sistemin nerede ayrıldığını da söyler.

  • Yüzde hesaplayıcı

    Taban, bir sayının nasıl yazıldığını söyler; yüzde ise bir başkasının yanında ne kadar ettiğini. O sayfa payları, değişimleri ve ters hesapları çözer ve formülü kendi sayılarınızla yazar.