Sekiztaller nerede faydalıdır? [kapalı]


36

PHP'de tamamen garip bir hataya bakmak için kafamı 20 dakika masaya çarptım ve sonra sekizlik olduğunu gördüm. <% (* & #> Sekizlik).

Kısacası, bazı değişmezleri sıfırlarla doldurdum, böylece kod hizalanacaktı, biliyorum, büyük hata. Sekizlikleri unuttum.

Asıl soru, herhangi biri dosya izinlerinden başka bir şey için sekizlik kullanıyor mu? (Kişisel olarak tercih ederim, chmod ugo+rwxancak programatik olarak üretilmeleri gerekiyorsa, oktallerin kullanılmasının faydalı olduğunu anlıyorum.) Fakat başka herhangi bir durumda yararlılar mı?


16
Seçenek A: Kendini suçla. Seçenek B: Dünyayı suçla. Seçenek C: Bir şey öğrendiğiniz için kıkırdama.
İş

12
@Petrozza - IMO, oktalın iyi bir seçim olmadığını göstermek için önde gelen sıfırın C tarzı kullanımı hiçbir zaman iyi bir seçim olmadı, ancak tarihçesi - daha da eski olmasına rağmen muhtemelen biraz C mirası. Ada'nın daha iyi anlaşmalardan birine sahip olduğunu düşünüyorum - sekizli bir sayı 8 # 1234567 #, altıgen bir sayı 16 # abcdef #, vb. Yazılır ve baştaki sıfırlar sadece baştaki sıfırlardır - 2 ila 16 arasındaki herhangi bir temel (en azından) geçerlidir ve hepsi görsel olarak açık ve anlaşılması kolaydır.
Steve314

2
@Petruza Sorunuz orjinal haliyle bu site için yapıcı değildi ve topluluk tarafından açık kalması için geliştirildi: İnsanların bunu neden yaptığı ve neden teşvik ettiğimiz hakkında daha fazla bilgi için SSS bölümüne bakın . Başka sorunuz ya da endişeniz varsa, lütfen bunları sorunuzda meta-tartışma sitemizden gündeme getirin.

11
Seçenek D: "PHP'yi suçla" sorundan bağımsız olarak daima doğru seçimdir
Cephalopod

2
@ Steve314 Tamamen katılıyorum. Dikkate değer başka bir örnek, 0oön eke sahip oldukları Python'dur (ki bunlarla tutarlı 0xve 0bbelki de ondan ayırt edilmesi biraz zor 00). Python 3'ten bu yana, fazladan önde gelen sıfırlar bu tür hataları önlemeye yönelik bir sözdizimi hatasıdır.
5gon12eder

Yanıtlar:


42

Wikipedia'ya göre , octallar eskisi kadar yaygın değil. Diğerlerinin daha önce de belirttiği gibi, geçmişte, sistemlerde onaltılıktan daha kolay bir şekilde sekizlikten daha kolay temsil edilen 12/24/36 bitlik bir kelimeye sahipti, ancak şu anda, x86 ve i64 mimarileri 16/32/64 bit kullanıyor onaltılı ve düpedüz çirkince daha kolay temsil edilen kelime, oktalde.

Ancak mevcut kullanımlar şunları içerir:

Modern programlama dillerinin bazen kullanım durumlarının olmaması ve hata potansiyeli nedeniyle artık oktalleri desteklemediğini unutmayın. C #, Eric Lippert'in TCPL 3. ve 4. basımlarında yazdığı bir örnektir :

C #, iki nedenden ötürü sekizli değişmezleri desteklemiyor. İlk olarak, bugünlerde neredeyse hiç kimse sekizli değişmez kullanıyor. İkincisi, C #, standart "önde gelen sıfır sekizli" biçiminde sekizlik destekliyorsa, olası bir hata kaynağı olacaktır. Bu kodu göz önünde bulundurun:

    FlightNumber = 0541;

Açıkçası bu ifade, sekizli bir değişmez değil, sekizli bir değişmezdir.

İlgili, ve sadece referans ve merak için, Kod, Bilgisayar Donanımının Gizli Dili , sayfa 55 - 63'teki sekizli ve diğer sayı sistemlerinde kolayca izlenebilen mükemmel bir açıklamaya sahiptir .


1
Bu notta, kullanıcı girişi ile çalışırken Javascript'e dikkat edin. parseInt(011)==9
Darien

3
Bu, Yuki ve Pamean için gerçekten ilginç. Az önce, onaltılık parmak sayımının her parmağın içini kullanırsanız, bunun gibi bazı varyasyonları kullanarak
gördüm

@Slomojo - yapabilecekleriniz Parmaklarınıza 99'a saymak ... aslında,
detly

3
Çok kapsamlı bir cevap için + 1'leyin. Grace Hopper bir keresinde çek defterini dengeleme konusunda sıkıntı yaşadığını, çünkü sekizlik katma konusunda çok ustalaşmıştı.
Macneil

14
@detly, eğer büyük sayıları saymam gerektiğini biliyorsam, 10 hanemi bit olarak kullanacağım ve sadece parmaklarımla 1024 sayacağım (# 4, # 128 ve # 132'ye kime gösterdiğinize dikkat edin).
zzzzBov

17

Octal, yaklaşık 50 yıl önce Digital Equipment Corp. (DEC) ve 12 bit kelimeli (örneğin PDP-8) bilgisayarlara sahip diğer şirketler veya 18 ve 36 gibi altı tanenin katları (örneğin, UNIVAC 1108) tarafından yaygın olarak kullanılıyordu. ). Hem PDP-8 hem de UNIVAC 1108'i yüksekokulda kullandım. Her iki makinedeki karakterler tipik olarak 8 değil altı bit kullandılar.

PDP-8 komut formatı

PDP-8 komut formatı - bitlerin 0 -> 11 numaralandırıldığına dikkat edin. Bit 0, MSB'dir (en önemli bit).

DEC, 16-bit PDP-11 ile çıktığında, o sırada 16-bit makinelerle çıkan diğer minibilgisayar üreticileri tarafından kullanılan onaltılık yerine belgelerinde sekizlik kullanmaya devam ettiler. Bu muhtemelen PDP-11 komut formatlarında bulunan Register, Mode ve Src / Dest gibi çoklu sekiz bitlik alanların sekizlik bir rakam olarak çözülmesine neden olmasından kaynaklanıyordu. (Bunu işaret ettiği için John Strohm'a teşekkürler.)

İlginç bir şekilde, Motorola, PDP-11'den ağır şekilde etkilenen ve talimatlarda aynı 3-bit Mod ve Kayıt alanlarına sahip olan 68000 mikroişlemci ile çıktığında, belgelerinde yalnızca onaltılık kullanmayı seçtiler.

PDP-11 sekizli gösterimi kullandığından, ilk önce PDP-11'de görünen Unix'in orijinal izin kodları da sekizlik kullandı. Bu miras Linux'ta devam eder, burada chmod komutu hala üç bitlik 'rwx' alanlarının her birini belirtmek için sekizlik kullanır.

Biraz daha trivia - 1980'lerde ve 1990'ların başında (AOL tarafından gölgede bırakılmadan önce) yaygın olarak kullanılan bir çevirmeli çevrimiçi hizmet olan CompuServe, en azından asıl olarak DEC mini bilgisayarlarında çalıştı. Tüm kullanıcı kimlikleri sayısaldı ve bir noktada hiçbir zaman 8 veya 9'ları içermediklerini gözlemledim, bu nedenle sekizlik halindeydiler. Eski CIS kimliğim 70205 idi.


1
PDP-11 belgeleriyle ilgili yorumunuz yanlış. PDP-11'de 8 kayıt vardı. R0-R5 genel amaçlı kayıtlardı. R6 yığın göstericisiydi ve R7 PC idi. MOV komutu iki 3-bit kayıt numarası ve iki 3-bit adresleme modu aldı. Sekiztal kayıt ve mod alanlarını mükemmel yakalar. (Bunun bir kaza olduğuna kesinlikle şüpheliyim.) Onaltılık kullanmak her şeyin kafasını karıştırırdı. PUSH ve POP sadece R6 kullanan modları ele alıyorlardı. Anında işlenen, R7'yi kullanan bir adresleme moduydu.
John R. Strohm

@ JohnR.Strohm Yorumunuz için teşekkürler, 3-bit kayıtları. Analizinize katılıyorum ve cevabımı güncelledim.
tcrosley

Böylece DEC OCT'de çalıştı. Karışıklığı önlemek için sadece 3,32 bit katları kullanmalıydım.
user234461,

Unix izinlerini hiçbir zaman sekizli bir sayı olarak kabul etmem, komik, her zaman üç rwx bitini temsil eden, birlikte yazılmış üç ayrı rakam olarak düşündüm, böylece sekizli, ondalık, hatta altıgen olabilirdi.
axl

11

Heathkit bunları H-8'lerinin ön panelinde ve ön panel yazılımlarının (PAM-8 olarak adlandırılır) derleme dili listelerinde kullandı. Kendimle çıkmayı biliyorum.

görüntü tanımını buraya girin

Günümüzde oktaller çok nadirdir; herkes hex kullanıyor gibi görünüyor. Fakat rakamlar hala sekizlik rakamlara benziyor ve A ile F arasındaki rakamlar için ek bir anahtar sırasına ihtiyacınız yok.


2
H-8 için +1. Dışında sekizlik olmasına rağmen, CPU 8080A idi ve hepsi bayttı. Git figger.
Blrfl

Sanırım, H-11 (PDP-11 işlemcili olan) ile ortak kullanım için sekizlik kullandılar.
Jerry Coffin

2
8080, 8 bit bayta sahipti, ancak komut seti, sekizlikten ziyade sekizlik olarak bakıldığında daha anlamlıydı.
RBerteig

6

Octal'ın kullanımı görmesinin nedenlerinden biri, herhangi bir özel karaktere ihtiyacınız olmayan 2 gücünün en büyük üssü olmasıdır - yani, tüm rakamlar sayısal olabilir. Taban 16 (taban 8'den bir sonraki) sayısal olmayan rakamlar gerektirir (genellikle A, B, C, D, E, F).


Bunun eski olduğunu biliyorum ama neden yalnızca rakamları kullanarak harfleri kullanmakta daha fazla tercih edilsin?
Petruza

5

Her gün sekizlik kullanırım. Ne zaman bir dosyayı chmod gerekir her zaman octal kullanıyorum (u + r gösterimini önceden tarihlendiririm ...). Kontrol karakterini bir dizgenin içine yerleştirmek istediğimde oktal kullanıyorum ... (Evet, hex kullanabilirim, ama octal kullandığım şeydir).


2
+1 "ama octal kullandığım şey" :)
JoelFan

5

Üçlü halinde gruplanmış bit kombinasyonlarını ifade etmesi gereken herkes.

Neden kimse hex kullanıyor?


Kafamın üstünde, sekizlik sayılarla ifade edilen şeyler:

  • Uçaklarda Mode 3A transponderleri tarafından ezilmiş kodlar
  • ARINC 429 aviyonik veriyolunda bazı değerler bulundu
  • SCSI adresleri
  • ncursesKütüphanedeki anahtar kodlar

11
Fark, altıgen yarım bayt olarak "doğal" dır. İki onaltılık basamak = 1 bayt. Ancak baytları sekizli rakamlara bölemezsiniz.
Mason Wheeler

2
İlk satır açıkça ifade ediyor. İkincisi zayıf bir benzetme yapar.
back2dos,

3
Ve hex, yukarıda belirtilen Unix dosya modları gibi üç bitlik gruplar halinde ifade edilmesi gereken herhangi bir şey için tamamen doğal değildir. Belirli bir numaralandırma sisteminin rakamlarının bayt ile aynı hizada olması gerektiğini söyleyen hiçbir yasa yoktur. Olsaydı, herhangi bir şeyi bir bilgisayara 10 olarak ifade etmek, en azından bit gruplarıyla aynı hizada olan 8 numaralı tabana göre daha kötü bir uygulama olurdu.
Blrfl

6
Tipik bir altıgen dize açıkça altıgen bir dizedir. sekizli değil.
Paul Nathan,

1
@Blrfl: Öyleyse, bunlardan “üç bitlik gruplar halinde ifade edilmesi gereken şeyler” den kaç tanesini kanonik örnekten ayırabiliriz? Şimdiye kadar cevapsız bıraktığın asıl soru bu. Bunun yerine başka bir zayıf benzetme yaparsınız. Ondalık gösterimi için gerçek bir kullanım var , çünkü basitçe ele almayı öğrendik. Hangisi olacak sen daha hızlı hesaplamak? 7 * 6ya 07 * 06? Sayıları temsil etmek için ondalık, en iyi şekilde kullanabildiğimiz için hex, makinenin kaydetme biçimine çok yakın sayıları temsil etmek için hex kullanın. Ve bunu çok yaparız. Bu site kanıtlarla dolu.
back2dos

5

CDC anabilgisayarlarında (60-bit kelime, PPU için 12-bit kelime ile) çalıştığımda, tüm çekirdek dökümleri ve benzeri sekizlik (PPU kelime başına 4, kelime başına 20 sekizlik rakam) yapmıştı.


3

Onaltılık gibi, sekizli gösterim bazen karakter kodlarını belirtmek için kullanılır. Onaltılı olan aynı sebepten dolayı kullanışlı olabilir: İkili dosyadan daha küçüktür, fakat kafanızdaki ikiliye çevirmesi çok kolaydır.


2

Hex gibi, Octal sayılarının ikiliden dönüştürülmesi kolaydır. İkili haneleri sağdan başlayarak üçlü gruplar halinde gruplayın.

10010101110  // binary

// conversion
(010)(010)(101)(110)
// so, in octal we have...
(2)(2)(5)(6)
2256

10010101110 (base 2) == 2256 (base 8)

7
Bu apaçık. Asıl soru, bunun ne zaman kullanıldığı ile ilgilidir .
back2dos

2
@ back2dos: o zaman lütfen aynı yorumu birden çok kez bırakmak yerine, cevap yazmaktan çekinmeyin.
Ed S.

4
@ Ed S. Soruyu cevaplamaya bile çalışmadınız. Özgün posterin neredeyse kesin olarak cevabı bildiği açıkça belli bir şey söyledin. Moderatörler söylemekten hoşlandıkları için, çekim yaptığımız şey bu değil. Daha fazla bilgi için meta.programmers.stackexchange.com/questions/1968/… adresine bakın .
btilly

@ back2dos, btilly - Stackexhange sitelerinde cevaplar sadece OP için değil, geçen okuyucular için kalıcı bir kaynak haline gelir. Tüm bariz gerçekler, herkes için açıkça belli değildir, eğer bu cevap değerli bir kişi için bir kuruşa yardım ederse .
ocodo

2
@Slomojo bu argümana rağmen, her soru bir konunun ilgili her yönü için wiki olabilir. Mesele şu ki, bu soruyu cevaplamıyor . Bu cevap kesinlikle başka bir yerde geçerli olabilir, "Nasıl zihinsel olarak octa dönüşürsün?"
Nicole,

2

Hayır! Onları hiç kullanmadım. Dosya izinlerini ayarlamak için bile değil, çünkü çok nadiren okumayı zor buluyorum.

Öyleyse evet, ve ikiliden dönüşüm için bariz bir fayda var.
Bununla birlikte, @Mason'un işaret ettiği gibi, hex çok daha "doğal" dır, çünkü 2 hex rakam bir bayt yapar. 24/32 bit RGB / ARGB renkleri, IP adreslerini, bayt maskelerini vb. Göstermek için kullanışlıdır. Diğer taraftaki octal gerçekten pratik değildir, çünkü nadiren 3 bitlik gruplar halinde çalıştığınız senaryolara sahipsiniz.

Dosya izinleri aslında düşünebildiğim tek şey. Ve şu andan itibaren kullanım alanı yoksa, hiç olacağından şüpheliyim. Son 20 yıldan beri alan çok ucuz hale geldiğinden, hizalama, kullanım kolaylığı ve genişletilebilirlik pahasına bilgi bu kadar sıkı bir şekilde paketlenmesi çok nadir hale geldi.


2

Bir kenara biraz, ama halka açık bir kullanım Londra Metrosu'nda. Her tren, hem fiziksel bir kimliğe hem de hizmet sırasında gösterilen programlarda ayrı bir kimliğe sahiptir - buraya bakınız: https://upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (hedef ekranın üst kısmındaki 402’yi not edin). Ekranlar için kullanılan elektronikler standart ondalık tabanlı olmasına rağmen, 8 veya 9 rakamlarını asla göremezsiniz, çünkü bunlar sinyalizasyon sisteminde eski sekizlik tabanlı donanıma bağlıdırlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.