Programlama yaparken neden diğer sayı tabanlarını kullanmalı


35

İş arkadaşlarım ve ben, 10 numaradan başka bir üsde sayıları programlamak için neden birisinin yoluna çıkacağını bulmak için zihinlerimizi büküyoruz.

Belki de değişkenleri üzerinde çalıştığınız doğru tabanın içine yerleştirerek daha uzun denklemleri optimize edebileceğinizi önerdim (örneğin, yalnızca 5 tabanını, kalan 5'i kullanamayacağınız hiçbir şeyden oluşan bir grubunuz varsa), ancak emin değilim eğer bu doğruysa.

Düşüncesi olan var mı?


6
Bu soruyu ortaya çıkaran özel bir örneğiniz var mı? Temel-2 veya temel-16'daki şeyler açıkça bir faydası vardır, çünkü bir bilgisayarın anlaşması daha kolaydır.
KDiTraglia

4
"Temeldeki programlama numaraları ..." ne demek oluyor? Sayılar var. Dönemi. Dahili olarak bazı temellerde temsil edilirler, ancak bu çoğunlukla önemli değildir ve herhangi bir aritmetik kuralını değiştirmez .

12
@JMD - lütfen iki çapraz gönderinizden birini kaldırmak ve buraya P.SE.'ye yerleştirmek için moderatörlerle birlikte çalışın. Siteler arasında çapraz yayınlama kaşlarını çattı. Mods sizin için soruları taşıyabilir.

10
@JMD - Çapraz gönderme hala yapmanız gereken bir şey değil. Gerekirse , bu tür sorular için bir göç süreci var .
Oded

2
@JMD Mesaj göndermeyin, birden fazla site için uygun bir soru son derece nadirdir. Mesela bu sefer, sorunuz Overflow ile ilgiliydi. Ancak sorunuz her iki site için de uygun olsa bile, sorunuzu siteler arasında alışveriş yapmak genellikle kaşlarını çattı. Hepimiz burada zamanımıza gönüllüyüz, en azından bir süre çapraz göndermeden önce Stack Overflow'ta aldığınız cevapları değerlendirmek için beklemiş olabilirsiniz.
yannis,

Yanıtlar:


59

Rakamlarla 10 numaralı basamağın dışındaki kodların yazılmasının genel sebebi, biraz titremenizdir.

C'de bir örnek seçmek için (çünkü C bir şey için iyi ise, bit bükme için iyidir), bazı düşük seviyeli formatın bir baytta 2 bit ve 6 bit sayı kodladığını söyleyin xx yyyyyy:

main() {
    unsigned char codevalue = 0x94; // 10 010100
    printf("x=%d, y=%d\n", (codevalue & 0xc0) >> 6, (codevalue & 0x3f));
}

üretir

x=2, y=20

Böyle bir durumda, sabitleri onaltılık harflerle yazmaktan daha az kafa karıştırıcıdır, çünkü bir onaltılık rakam dört bite (yarım bayt; bir 'nibble') ve iki ila bir bayta tekabül eder: sayının 0x3ftüm bitleri vardır düşük uçta ayarlanmış ve iki uçta yüksek uçta ayarlanmış.

Bu ikinci satırı da sekizlik olarak yazabilirsiniz:

printf("x=%d, y=%d\n", (codevalue & 0300) >> 6, (codevalue & 077));

Burada, her hane üç bitlik bir bloğa karşılık gelir. Bazı insanlar bu günlerde oldukça nadir olduğunu düşünüyorum, ancak düşünmek için daha kolay buluyorum.


Başka bir örnek "sihirli sayı" 0xDEADBEEF'in kullanılması olabilir. Bu yazıya bakın stackoverflow.com/questions/5907614/0xdeadbeef-vs-null
Etsitpab Nioliv

45

Farklı bazlar kullanmamın ana nedeni bitlere önem vermemdir.

Okumak çok daha kolay

int mask=0xFF;
byte bottom_byte = value & mask;

göre

int mask=255;
byte bottom_byte = value & mask;

Veya daha karmaşık bir şey hayal edin

int mask=0xFF00FF00;
int top_bytes_by_word = value & mask;

nazaran

int mask=4278255360; //can you say magic number!? 
int top_bytes_by_word = value & mask;

Burada hex örnekleri ile neyin var olduğu çok açık, çünkü hex temelde sadece daha kompakt bir ikili biçimdir ... Buna karşılık, base-10 (kullandığımız) neredeyse ikili olarak eşlenmez.

0xFF = b11111111 = 255
0xFFFF = b1111111111111111 = 65536
0xF0F0 = b1111000011110000 = 61680

Bazı dillerde kullanabileceğiniz başka bazlar da vardır. İkili, altıgen ve ondalık basamaklardan çok daha az baz kullanımı bulacaksınız. Bazı garip insanlar hala octal kullanıyor, ama bu aklı başında bir programda göreceğiniz en ezoterik.


2
Sekizlik nadir değildir, 0'ı sekizdir :) (Stack Exchange ağında bir yerde, şimdi bulamadığını gördüm).
gerrit

2
@Earlz: çok fazla parmağı olan insanlar . :-)
Bryan Oakley

3
26 x 2 + 10 = Tüm büyük ve küçük harfler ve tüm sayılar. Gerçekten o sıradışı değil. Üstelik aynı zamanda, büyük küçük harf duyarlı olmayan sürüm olan Base 36'nın da kullanıldığını gördüm.
Darrel Hoffman

3
@vasile: Bir saatte 60 dakika ve bir dakikada 60 saniye var, çünkü insanlar tersi şekilde değil, base-60 sistemlerini kullanıyorlardı. Umarım doğada bir saat içinde 60 dakika olması gerektiğini söyleyen bir şey olduğuna inanmazsınız!
Joren

1
evet, yıldızlarda okurlar ve zamanın ölçülmesi için base-60'ı kullanırlardı. Yılda 360 gün (= 6x60) ile 60 tabanındaki süreyi ölçmek o kadar da zor değil.
ytg

8

Muhtemelen bildiğiniz gibi, bilgisayarlar ikilik üzerine kuruludur - bu temel 2'dir.

Öyle kolay tabanı 2 ve 4, 8 ve 16 (ve 2 benzer katları) ve çok daha kolay yaklaşık nedenden için sayılarla çalışma yapabilir kaynak kodunda bu çeviriyi tutarak arasında dönüştürme.

Assembly ve C gibi düşük seviyeli diller için bu, doğrudan işlemci işlemlerine (örneğin bölme ve çarpma için bit kaydırma) çevrilebilir, bu, bu sayı tabanlarını kullanmanın çok daha hızlı kodla biteceği anlamına gelir.

Ek olarak, tüm işlemler sayısal işlem değildir - doğrudan bitlerle uğraşmanız gereken bit haritalar vardır - bir taban 2 veya bunun katlarından birini kullanarak işlemleri çok daha kolay hale getirir.

Daha fazla bilgi edinmek istiyorsanız, Charles Petzold tarafından Kod okumanızı öneririm .


3
Derleyici umurumda değil. Listelenen bazlar arasında dönüşüm yapmak gerçekten daha kolay olsa da, baz 10 için basit (yavaş-ish) bir dönüşüm özellikle de zor değildir ve derleyici yapımı için yararlı olan çoğu dilde (bunun için montaj kullanmazsınız) dönüşüm, standart kütüphanelerinde mevcut olduğundan derleyiciler için etkili bir şekilde ücretsizdir.

1
C de onaltılık kullanarak daha hızlı programlara çeviri yapmaz. Derleyici hangi tabanı kullandığın umrunda değil.
Charles Salvia

5
Programın hangi temelde yazıldığına bakılmaksızın, derleyici derleme zamanında onu ikiliye çevirir. Montaj talimatları aynıdır.
Karl Bielefeldt

2
Kurumsal bilgisayarlar aslında üçlü bir enerjiye dayanıyor: gerçek, yanlış ve "dosya bulunamadı"
Martin Beckett


4

Oldukça özel programların dışında, 10, 16 ya da 2 dışında bir üs kullanmak oldukça nadirdir.

Base 16 (onaltılık) basitçe kullanışlıdır, çünkü bir baytın (0-255) tam aralığı, ham hex-dump'lar veya ikili verilerle çalışmayı çok daha kolaylaştırabilen iki basamakta (0x00-0xFF) gösterilebilir. Onaltılık da bitsel işleçlerle bit maskeleri kullanırken kullanışlıdır, çünkü iki basamaklı bir bayt yazışmalarına okunabilirliği sağlar.

Daha nadir olarak, temel 2 (ikili), bitsel işlemler ile de kullanılabilir, ancak birçok programlama dili temel 2 hazır bilgisini desteklemez ve yine onaltılık çok daha özlü ve okunabilirdir.

Base-8 (sekizli), bazen UNIX dosya izinleri nedeniyle de kullanılır. Bunun dışında, son derece uzmanlaşmış matematiksel bağlamların dışında 10 dışında üs kullanmak oldukça nadirdir.


Sekizli genellikle karakter değerlerini belirtmek ve bazen ikili verileri dökmek için kullanılır.
Caleb

3

Diğer üsleri kullanmanın en yaygın geçerli nedeni, üs 2'ye dönüştürme kolaylığı ile ilgili olmalıdır: bir taban-8 veya taban-16 sayısının, sekiz veya on altı kısa bir tabloyu ezberleyerek hesap makinesi kullanmadan ikiliye dönüştürülmesi çok önemlidir. numaraları:

 0000 0     0001 1     0010 2     0011 3
 0100 4     0101 5     0110 6     0111 7

 1000 8     1001 9     1010 A     1011 B
 1100 C     1101 D     1110 E     1111 F

Bu, birden fazla olasılık açar:

  • Bir sayı, anlamlı ikili sayıların bir kompozisyonunu temsil ettiğinde, tek tek bileşenleri bilgisayar olmadan belirleyebilirsiniz. 24 bit numarası RGB bir renk temsil Örneğin, söylemek saçmadır 0xFF00FFolan eflatun (Kırmızı + Mavi); görev sunulduğunda çok daha zor16711935
  • Bir sayı bit maskesini temsil ettiğinde, çok daha uzun bir ikili sayı yerine, onu kompakt bir onaltılık sayı olarak yazmak daha pratiktir.
  • Bazı mimariler, sekizlik kodlar olarak basıldığında ikili kodlarını okumayı kolaylaştırmak için kendi yollarını kullandılar. PDP-11 böyle bir sistemdi: en önemli bit, 16 bit olanlardan 8 bitlik işlemleri anlatmanıza izin verirdi; Son iki sekizli grup, operasyona dahil olan iki kayıtçıya vb. söyleyebilmenizi sağlar. PDP-11 ikili kodunu ekrandan demonte olmadan okuyabilen birkaç kişi biliyordum, ancak makine kodunun sekizli sistemde basılması gerekiyordu.

2

Bilgisayar (veya daha doğru bir şekilde derleyici) kaynak kodunuzda hangi sayı tabanını kullandığınızla ilgilenmiyor. En sık kullanılan programlama dilleri doğrudan 8 (sekizli), 10 (ondalık) ve 16 (onaltılık) üsleri destekler. Bazıları ayrıca baz 2 (ikili) sayıları için doğrudan spor desteği. Uzmanlaşmış diller, diğer sayı tabanlarını da destekleyebilir. (“Doğrudan destek” ile, kaynak kodun kendisinde bit değişimi, çarpma, bölme vb. Gibi matematiksel püf noktalarına başvurmadan bu tabandaki sayıların girilmesine izin verdikleri anlamına gelir.0xsayı öneki ve 0123456789ABCDEF'in normal onaltılık basamak kümesidir. Şimdi, bu hileler sayının bağlam içinde anlaşılmasını kolaylaştırmak için faydalı olabilir, ancak aynı sayıyı onlarsız ifade edebildiğiniz sürece, yapmak - ya da değil - sadece bir kolaylıktır.)

Sonunda, ancak, bu eşitsizdir. Diyelim ki şöyle bir ifade var:

int n = 10;

Amaç bir tamsayı değişkeni oluşturmak ve onu 10 sayı ile başlatmak. Bilgisayar ne görüyor?

i  n  t     n     =     1  0  ;
69 6e 74 20 6e 20 3d 20 31 30 3b (ASCII, hex)

Derleyici bunu belirleyecektir intve adla bir tür değişkeni bildirdiğinizi fark edecek nve ona bir başlangıç ​​değeri atayacağınızı fark edecektir. Ama bu değer nedir?

Bilgisayara ve bayt sıralaması ve hizalama sorunlarını göz ardı ederek değişkenin başlangıç ​​değeri için girdidir 0x31 0x30. Bu, başlangıç ​​değerinin 0x3130 olduğu (10 tabanındaki 12592) olduğu anlamına mı geliyor? Tabii ki değil. Dil ayrıştırıcı, kullanılan karakter kodlamasında dosyayı okumaya devam etmelidir, bu nedenle 1 0bir ifade sonlandırıcısı tarafından okundu . Bu dil tabanında 10 varsayıldığı için, bu, "0 tane, 1 on, son" olarak okur (geriye doğru). Yani, 10 ondalık değer.

Onaltılık olarak bir değer belirtirsek ve dilimiz 0xaşağıdaki değerin onaltılık olduğunu belirtmek için kullanırsa , aşağıdakileri alırız:

i  n  t     n     =     0  x  1  0  ;
69 6e 74 20 6e 20 3d 20 30 78 31 30 3b (ASCII, hex)

Derleyici 0x(0x30 0x78) görür ve bunu base-16 öneki olarak kabul eder; bu nedenle, geçerli bir 16-taban sayısını takip eder. Açıklama sonlandırıcısına kadar okur 10. Bu, 10 üssünde 16'ya giden 0 "olanlar", 1 "altmışlar" anlamına gelir.

Her iki durumda ve sadelik uğruna optimizasyonları görmezden gelen, derleyici, bir inttür değişkeninin değerini tutacak kadar depolamayı ayırır ve kaynak kodundan okuduğu değeri bir tür geçici tutma değişkenine yerleştirir. Daha sonra (büyük olasılıkla daha sonra) sonuçta elde edilen ikili değerleri nesne kod dosyasına yazar.

Gördüğünüz gibi, kaynak koduna sayısal değerler yazma şekliniz tamamen önemsizdir. Bu olabilir bir bilgisi çok hafif derleme kez etkiye ama dönen diskin plakalı disk erişim zamanları veri yolu çarpışmalar etrafında rasgele türbülans gibi şeyler (örneğin işletim sistemi tarafından disk tamponlama gibi optimizasyonlar göz ardı tekrar) hayal ediyorum , vb., çok daha büyük bir etkiye sahiptir.

Alt satır: endişelenme. Programlama tercihinizin desteklediği ve sayının nasıl kullanılacağı ve / veya okunacağı konusunda anlamlı olan bir tabana sayıları yazın. Bu yanıtı okumak için derleme zamanlarında kaynak kodda hangi sayı tabanının kullanılacağına dair zekice davranarak elde edeceğinizden çok daha fazla zaman harcadınız. ;)


1

Neden birileri sayıları 10 tabanından farklı bir temelde programlayabiliyorsa?

İşte henüz görünmeyen bazı sebepler ...

x00 - Bazı işletim sistemleri ve donanım cihazlarının API'leri argümanların hex / binary olmasını bekliyor. Bu tür API'leri kodladığınızda, sayıları farklı bazlar arasında dönüştürmek yerine API'nin beklediği formatta kullanmak daha kolaydır. Örneğin, bir sunucuya mesaj sonu baytı göndermek veya bir iletişim kanalıyla bağlantıyı kapatmak için mesaj göndermek için.

x01 - Uygulamanızın, telif hakkı işareti gibi bazı klavyelerde bulunmayan karakterleri temsil etmesini isteyebilirsiniz (\ u00a9).

x02 - Bazı sabitlerin / değişmezlerin, özellikle kaynak kod / dosyalar farklı yerel ayarlara sahip geliştiriciler arasında taşındığında, farklı kültür ayarlarında (görsel olarak) kalmasını sağlamak.

x03 - Kodlarının kafa karıştırıcı ve karmaşık görünmesini sağlamak için - İyi ki, C #'nın sekizli sabitleri desteklemediği!


1

Önemli olan, bilgisayar boyutunda tek bir kelimeyi makul bir şekilde ifade etmektir. 6502 8 bit işlemciydi. 4004 4 bit işlemciydi.

4 veya 8 bitlik bir sayı ile uğraşırken güzel çalışıyor. 4 bitlik sayı tek bir onaltılık karakterdir. 8 bitlik bir sayı (bayt) iki onaltılık rakamdır. 2 boyutlu kelime gücüne sahip sistemler bugün yaygın görülen standarttır - 16 bit, 32 bit, 64 bit. Bunların hepsi onaltılık olarak gösterilmek üzere 4 ile bölünürler.

Sekizlik (8 taban), kelime büyüklüğü 12, 24 veya 36 olan sistemlerde kullanılmıştır. PDP8, IBM Mainframe ve 1900 günlük ICL bunları kullanmıştır. Bu kelimeler sınırlı onaltılık alan yerine oktetler kullanılarak daha kolay bir şekilde temsil edildi (evet, ayrıca 4'e bölünüyorlar).

Görünüşe göre baz 8 numaralandırmanın kullanılmasıyla maliyet tasarrufu da yapıldı. BCD'deki 12 biti temsil eden ilk hane sadece 0-4 olabilir, ikincisi üçüncü ve dördüncü 0-9 olabilir. Eğer bu hex olarak yapılmışsa, 3 hex karakter var ama her biri 16 olası değere sahip. Sadece 0-7 olan bir nixie tüpü üretmek , 0-9 (BCD için ek mantıkla) veya onaltılık için 0-F'ye sahip olmak için daha ucuzdu.

Biri, bugün hala, unix dosya izinleriyle (755, 644), sekizinci sahibi, grubun ve dünyanın, izinleri temsil eden 3 bite sahip olduğunu görüyor.


Matematik dünyasında, zaman zaman biri farklı temellere sahip garip şeyler yapar. Örneğin, proje euler 396'dan gelen zayıf bir Goodstein sekansı ... veya palindromik sayılarla daha basit bir şey . N bazında bir sayının N - 1 katı olan bir sayının rakamları N - 1 katına kadar toplayacağı özelliği vardır . Dahası, eğer N - 1 mükemmel bir kare ise, bu özellik sqrt ( N - 1 ) için de var . Bunun bazı matematik problemlerinde bazı uygulamaları var.


1
Octal, PDP'nin 9/18 bit bayta sahip olması nedeniyle, sekizlik bir sayı 3 bit'i temsil ediyordu, bu nedenle bayt 3'e bölünebilirse çok mantıklı geliyor
Martin Beckett

1
Octal, bazı 16-bit sistemlerde de (en çok da PDP-11) kullanıldı, çünkü 15 - işaret biti hariç bit sayısı - güzel bir şekilde 3'e ayrılır. Orijinal UNIX işletim sisteminde (örneğin, "od", ikili dosyaları atmak için kullanılan standart araçtır ve varsayılan biçimi yalnızca izinler için değil, 8 bit altıgen yerine 16 bitlik sekizliktir). PDP-11 komut setinin iki adet 6 bitlik operand alanına sahip olması da geçerli olabilir.
Random832

Octal da, teknolojide zaman zaman gösterilebildiği için kullanıldı. Nexi tüpleri, kimse? Veya diğer 0-9 görüntüler? AF ekranlarının görünmesi biraz zaman aldı.
Jeremy J Starcher

1

Finans endüstrisinde, etkili bir şekilde baz olan 36 bir tanımlayıcı şeması vardır . 0-35 arasında rakamları temsil etmek için 0-9 sayılarını ve BZ harflerini kullanır. Herhangi bir iğrenç ismin üretilmesini önlemek için ünlüleri atlar.

Yine de mükemmel değil. Talihsiz bir şirketin kimliği olduğu bir zaman vardı B000BZ.


1

Sebep # 1: Devre seviyesindeki tüm sayılar temel 2'de gösterilir (elektrik anahtarı açık veya kapalı). Sebep # 2: gerçek devrelerden daha yüksek bir seviyede, bitler bayt olarak gruplanır ve baytlar, 3 ondalık basamağı (ve bazı onaylamaları) tüm olası değerlerini gösterecek şekilde kolayca onaltılık basamak olarak gösterebilir. bayt.

Dolayısıyla, bu seviyelerde çalışıyorsanız (veya bazı yönetilen ortamlarda onlara yaklaşıyorsanız), onluktan daha ikili veya onaltılık olarak çalışmak daha kolaydır. Bunu yapacağınız durumlar çeşitlidir, ancak genellikle hiçbir zaman yalnızca temel aritmetik işlemlere ihtiyaç duymadığınız durumlar değildir.


1

Temel 16 (onaltılık) sayıların çok sık kullanıldığı bir alan, özellikle web için HTML / CSS kullanıldığında renk belirtme alandır. Dijital ekranlarda kullandığımız renkler, 16 milyon görüntülenebilir renkten herhangi birini oluşturmak için (24-bit renk kullanarak) bir araya getirilmiş 3 "temel" renk (3B - kırmızı, yeşil, mavi) için 3 yoğunluk değerinin bir kombinasyonu kullanılarak belirlenir ).

Örneğin, altıgen içinde tam yoğunluklu yeşil 0x00ff00ve 65280ondalık olur. Şimdi, kafanızda kırmızı ve maviye eşit parçalara sahip bir rengi "el ile" karıştırmaya çalıştığınızı, yarı yoğunlukta, güzel bir mor yarattığınızı hayal edin :) Onaltılı olarak bu, bunun 0x800080için ondalık değerin olduğu gibi yazılır 8388736. Gri gölgeler ile çalışırken daha da kolay olur -% 50 griden 0x808080(onaltılık) ve 8421504(ondalık),% 75'tir 0xC0C0C0ve 12632256vb.

Onaltılı kullanımı çok daha sezgiseldir ve bu renk kullanımına aşina olan herkes hemen onaltılık değere bakarak rengi "tahmin edebilir". Aynı rengi birden çok kez kullanmanız gerekirse (genellikle böyledir), kullanım eğilimi daha azdır.

Çılgın miktarda onaltılık kullanım için herhangi bir web sayfasını (ve özellikle de CSS'yi) inceleyin: D

NOT: CSS'de onaltılık değerler bir #önek kullanılarak yazılır , örneğin: #00ff00yeşil için ve ayrıca bazen #0f0yeşil gibi yalnızca üç basamakla kısaltılır .


0

Bazı algoritmalar için, temel 2 her şeyden daha anlamlı. Örneğin, bir ikili ağacı mı, yoksa 10 yıllık bir ağacı mı geçmeyi tercih edersiniz?

Ancak, daha sık olarak, 2. taban kullanılır, çünkü bilgisayarların evrensel olarak sayılarını temsil ettiği şekildedir. Bu şu demek:

  • 2. aşamada birçok işlem daha verimlidir:
    • çarpma, bölme ve 2'nin modulo güçleri genel bölmeden çok daha hızlıdır
    • bayraklar ve küçük değerler daha büyük bir sayının ikili rakamları olarak daha verimli bir şekilde saklanabilir, alınabilir ve değiştirilebilir.
  • veri dosyalarını ve ağ veri akışlarını okuyan, yazan ve işleyen işlemler doğrudan ikili sayılar olarak temsil edilmeleriyle doğrudan ilgilenmelidir.

Ayrıca, her zaman, doğal olarak ne 2 veya 10 olabilen tek bir baz gerektiren nadir bir uygulama vardır.


2
Tabii ki 10 ary ağaç kullanırdım. Kullandığın garip 2karakter ne?
CodesInChaos

0

Dürüst olmak gerekirse, eğer bir nedenden ötürü çok ciddiyetiniz varsa ve 11 parmağınız varsa veya ayak parmaklarınızla saymayı seviyorsanız, üs 20'de çalışmaktan hoşlanıyorsanız, dürüstçe size kalmış. Ancak, evrensellik konusunda, günlük bazda bit ve baytlarla uğraşmak zorunda olan çoğumuzun, temel 19'da biraz manipülasyon yapan bir şey bulursak gerçekten gıdıklanacağının farkına varın.

TEMEL NEDENLER x

Taban 10 - Eşyalarımızın tümünün modeli, çünkü 10 sayma hanemiz var (ayaklar tuhaf ve koklamak, bu yüzden bunları kullanmıyoruz).

Temel 2 - Bilgisayarlar bunu bitler için kullanır (açma / kapama) bu, kapılar / transistörler / kondansatörler tarafından yayılan okunabilir voltaj seviyeleri ile ilgilidir.

Temel 8 - Eski, bilgisayarlar çok büyük olmadığında geri (ya da alan bilge olduklarında) bu bir şey ya da başkaları için iyiydi (biraz hoşuma gitmedi)

Taban 16 - Bit manipülasyonu için bir baytın üst ve alt dişlerini göstermek için iyidir. Bu, gömülü / fpga / donanım dünyasında süper kullanışlıdır.

BİLGİSAYARDA NORMAL BAZLAR

Tercihe göre, bir rengin bana "on" değerinin altıgen bir RGB değerinde nasıl olduğunu "söyleyebilirim", bu sonuç olarak donanımda tek bir int ile temsil edilebiliyor ve sonra da bazı kaymalar bana geri verilebiliyor easy-peasy, 1 karmaşık renk = sınırlı hafızaya sahip büyük görüntü işleme için güzel olan 1 veri noktası. Bunu temel 10 gösterimi ile karşılaştırın, hepsini ekleyebilir ve bir sayıya kaydedebilirsiniz, ancak hangi sayıdır, ya da R, zaman 10000, G 100 ve B kendi alanıdır, bu bir çok matematik işlemidir. , genellikle çarpmalar bir vardiyadan daha fazla devire mal olur, bu yüzden bir sonraki veri parçanız zaten son parça işlenmeden önce sıraya girmiştir;

Bazen sadece 2, 8 veya 16 numaralı üslerde çalışmak daha iyidir. Çoğu makinede 2 ile çarpmak sadece biraz kaymaktır, bunlar süper hızlıdır, aynı 2'ye bölünürler.

Biraz titreklik yapma fikrini daha da açıklamak. Bazı ışık dizisine, anahtarlara veya bazı diğer kayıt eşlemeli öğelere erişmek için ihtiyaç duyduğum katıştırılmış bir ortamda çalışırken çok sayıda var.

Bu durumda, her bir anahtara tüm karakter, bayt veya int atanması hem verimsiz hem de aptal olur, bir anahtar veya ışığın 2 konumu vardır - açık ve kapalı - neden 256 konumuna veya 2 ^ 16'ya kadar bir şey atayım? Bir dizideki her ışık, tek bir kelime / kayıt üzerinde 8 veya 16 veya 32 veya 64 veya 128 (veri tipinizin genişliği) ile uyuşan 1 bit olabilir. Alan verimliliği gerekli ve oldukça açığız.

RGB verilerini, birçok sinyal verisini (GPS, ses, ascii, vb.) Kullanma gibi şeyleri programlamada temel alan 2 ^ n'yi kullanma altıgen, ikili ve sekizli olarak çok daha basittir çünkü makinede ve Neyin sunulduğunu ve nasıl manipüle edileceğini daha kolay ayırt eder.

STRANGE BAZLARININ KULLANILMASI

Kodlamadığınız sürece verimlilik yok. 11 numaralı üssü istiyorsan, bunun için bir veri tipi kurmalısın ve kullanıcılara gösterimini yapması için tüm operatörleri aşırı yüklemelisin. 5 maddeye sahip olan ve sadece 5 maddeden katları tutan bir sistemin beş maddelik matematiğe dönüştürülmesinin bir nedeni olmadığını görmüyorum. Üstelik, üs 271 için kodlarını yazmaya karar vermiş olanların iyi belgelemiş olması veya üssü 271'i oluşturmaya değecek kadarını anlamak için daha fazla zaman harcamanız için dua etmelisiniz, çünkü tüm öğeler 271'in katıdır.



0

Diğer tüm cevapların alternatif üsler için hesaplamada iki yaygın kullanımdan bahsetmediğine şaşırdım:

  1. Kodlama : Örneğin Base64 kodlaması oldukça yaygındır. Kodlama, bir bayt dizisini büyük bir ikili (base-2) sayı olarak yorumlar ve bu sayıyı ASCII basamaklarıyla temsil edilen bir Base64 numarasına dönüştürür.
  2. Sıkıştırma : Temsilciliği kısaltmak için daha büyük bir tabanda ikili, ondalık veya onaltılık sayıları temsil etmek genellikle istenir. Örneğin, bit.ly gibi tüm bit kısaltıcılar bunu yapıyor. Veya bir URL'de kullanım için bir GUID'i kısaltmak için yapabilirsiniz.

    - 821F6321-881B-4492-8F84-942186DF059B (base-16 guid) 
    becomes
    - RRIDHW463YD8YXX7MIDI (base-36)
    - 3UFmaWDjj9lifYyuT0 (base-62)
    
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.