Tại sao sử dụng cơ sở số khác khi lập trình


35

Các đồng nghiệp của tôi và tôi đã suy nghĩ để tìm ra lý do tại sao bất cứ ai sẽ rời khỏi con đường của họ để lập trình số trong một cơ sở khác ngoài cơ sở 10.

Tôi đề nghị rằng có lẽ bạn có thể tối ưu hóa các phương trình dài hơn bằng cách đặt các biến vào cơ sở chính xác mà bạn đang làm việc (ví dụ: nếu bạn chỉ có bộ 5 thứ không có phần dư bạn có thể sử dụng cơ sở 5), nhưng tôi không chắc nếu đó là sự thật.

Có suy nghĩ gì không?


6
Bạn có một ví dụ cụ thể đưa ra câu hỏi này? Những thứ ở cơ sở 2 hoặc cơ sở 16 rõ ràng có lợi ích của chúng vì máy tính dễ hiểu hơn.
KDiTraglia

4
"Số lập trình trong cơ sở ..." nghĩa là gì? Có những con số. Giai đoạn. Chúng được đại diện nội bộ trong một số cơ sở nhưng điều đó hầu như không quan trọng, và không thay đổi bất kỳ quy tắc số học nào .

12
@JMD - vui lòng làm việc với người điều hành để xóa một trong hai bài đăng chéo của bạn và đặt một bài đăng ở đây trong P.SE. Đăng chéo trên các trang web được tán thành. Các mod có thể di chuyển câu hỏi cho bạn thay vào đó.

10
@JMD - Đăng bài chéo vẫn không phải là điều bạn nên làm. Có một quá trình di chuyển cho các câu hỏi như vậy, nếu cần thiết .
Oded

2
@JMD Không đăng bài chéo, một câu hỏi phù hợp với nhiều trang web là cực kỳ hiếm. Lần này, ví dụ, câu hỏi của bạn không có chủ đề trên Stack Overflow. Nhưng ngay cả khi câu hỏi của bạn phù hợp với cả hai trang web, việc mua sắm câu hỏi của bạn trên các trang web thường không được chấp nhận. Tất cả chúng tôi đều tình nguyện dành thời gian của chúng tôi ở đây, ít nhất bạn có thể đợi một lúc để đánh giá các câu trả lời bạn nhận được trên Stack Overflow trước khi đăng chéo.
yannis

Câu trả lời:


59

Lý do thông thường để viết số, trong mã, ngoài cơ sở 10, là vì bạn đang xoay vòng một chút.

Để chọn một ví dụ trong C (vì nếu C tốt cho mọi thứ, thì tốt cho việc xoay vòng bit), giả sử một số định dạng cấp thấp mã hóa số 2 bit và 6 bit trong một byte xx yyyyyy::

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

sản xuất

x=2, y=20

Trong trường hợp như vậy, việc viết các hằng số bằng hex ít gây nhầm lẫn hơn so với viết chúng theo số thập phân, bởi vì một chữ số hex tương ứng gọn gàng với bốn bit (nửa byte; một 'nibble') và hai đến một byte: số 0x3fcó tất cả các bit đặt ở mức thấp và hai bit được đặt ở mức cao.

Bạn cũng có thể viết dòng thứ hai trong bát phân:

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

Ở đây, mỗi chữ số tương ứng với một khối ba bit. Một số người thấy dễ suy nghĩ hơn, mặc dù tôi nghĩ nó khá hiếm ngày nay.


Một ví dụ khác có thể là việc sử dụng "số ma thuật" 0xDEADBEEF. Xem bài đăng này stackoverflow.com/questions/5907614/0xdeadbeef-vs-null
Etsitpab Nioliv

45

Lý do chính tôi sử dụng các cơ sở khác nhau là khi tôi quan tâm đến bit.

Nó dễ đọc hơn nhiều

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

hơn

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

Hoặc hình ảnh một cái gì đó phức tạp hơn

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

so với

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

Ở đây rõ ràng ý định của các ví dụ hex là gì vì hex về cơ bản chỉ là một dạng nhị phân nhỏ gọn hơn ... Ngược lại, cơ sở 10 (những gì chúng ta sử dụng) không ánh xạ gần như nhị phân.

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

Ngoài ra còn có các cơ sở khác bạn có thể sử dụng trong một số ngôn ngữ. Bạn sẽ thấy rất ít sử dụng các cơ sở khác ngoài nhị phân, thập phân và thập phân .. Một số người kỳ lạ vẫn sử dụng bát phân, nhưng đó là về bí mật nhất mà bạn sẽ thấy trong một chương trình lành mạnh.


2
Octal hoàn toàn không phải là hiếm, 0 là bát phân :) (thấy rằng ở đâu đó trên mạng Stack Exchange, không thể tìm thấy nó ngay bây giờ).
gerrit

2
@Earlz: người có nhiều ngón tay. :-)
Bryan Oakley

3
26 x 2 + 10 = Tất cả chữ in hoa và chữ thường và tất cả các số. Không thực sự khác thường. Tôi cũng đã thấy Base 36 được sử dụng, đây chỉ là phiên bản không phân biệt chữ hoa chữ thường.
Darrel Hoffman

3
@vasile: Có 60 phút trong một giờ và 60 giây trong một phút vì mọi người đang sử dụng các hệ thống cơ sở 60, không phải cách khác. Tôi hy vọng bạn không tin rằng có một cái gì đó trong tự nhiên nói rằng phải có 60 phút trong một giờ!
Joren

1
vâng, họ đọc nó trên các ngôi sao và họ đã sử dụng cơ sở 60 vì đo thời gian. với 360 ngày (= 6x60) một năm, thật không điên khi đo thời gian ở cơ sở 60.
ytg

8

Như bạn có thể biết, máy tính dựa trên nhị phân - đây là cơ sở 2.

Thật dễ dàng để chuyển đổi giữa cơ sở 2 và 4, 8 và 16 (và bội số tương tự của 2) và việc giữ bản dịch này trong mã nguồn có thể giúp làm việc với các số dễ dàng hơn rất nhiều để lý do.

Đối với các ngôn ngữ cấp thấp như hội và C, điều này có thể dịch trực tiếp sang các hoạt động của bộ xử lý (ví dụ như dịch chuyển bit để chia và nhân), có nghĩa là việc sử dụng các cơ sở số này kết thúc với mã nhanh hơn nhiều.

Ngoài ra, không phải tất cả các hoạt động đều là hoạt động số - có bản đồ bit mà bạn cần phải trực tiếp sử dụng các bit - sử dụng cơ sở 2 hoặc một trong nhiều bội số của nó để thực hiện thao tác dễ dàng hơn nhiều.

Nếu bạn muốn tìm hiểu thêm, tôi khuyên bạn nên đọc Code của Charles Petzold .


3
Trình biên dịch không cung cấp cho một chết tiệt. Mặc dù thực sự dễ dàng hơn để chuyển đổi giữa các cơ sở bạn liệt kê, một chuyển đổi đơn giản (chậm) là cơ bản 10 cũng không khó, và hầu hết các ngôn ngữ hữu ích cho việc xây dựng trình biên dịch (bạn không sử dụng lắp ráp cho điều đó) chuyển đổi có sẵn trong thư viện tiêu chuẩn của họ, vì vậy nó miễn phí cho trình biên dịch.

1
Sử dụng thập lục phân trong C không dịch sang các chương trình nhanh hơn. Trình biên dịch không quan tâm bạn sử dụng cơ sở nào.
Charles Salvia

5
Bất kể chương trình được viết trong cơ sở nào, trình biên dịch sẽ dịch nó thành nhị phân tại thời gian biên dịch. Các hướng dẫn lắp ráp là giống hệt nhau.
Karl Bielefeldt

2
Trên thực tế, máy tính doanh nghiệp dựa trên bộ ba tri-enery: đúng, sai và "không tìm thấy tệp"
Martin Beckett


4

Ngoài các chương trình chuyên môn cao, việc sử dụng các căn cứ khác ngoài 10, 16 hoặc 2 là khá hiếm.

Cơ sở 16 (thập lục phân) rất hữu ích đơn giản vì toàn bộ phạm vi của một byte (0-255) có thể được biểu thị bằng hai chữ số (0x00-0xFF), có thể giúp làm việc với dữ liệu nhị phân thô hoặc dữ liệu nhị phân dễ dàng hơn rất nhiều. Hệ thập lục phân cũng hữu ích khi sử dụng mặt nạ bit với các toán tử bit, bởi vì hai chữ số tương ứng với một byte giúp dễ đọc.

Hiếm khi hơn, cơ sở 2 (nhị phân) cũng có thể được sử dụng với các thao tác bitwise, nhưng nhiều ngôn ngữ lập trình không hỗ trợ chữ 2 cơ bản, và dù sao thì hệ thập lục phân cũng ngắn gọn và dễ đọc hơn nhiều.

Base-8 (bát phân) đôi khi cũng được sử dụng vì quyền của tệp UNIX. Ngoài ra, thật hiếm khi sử dụng các cơ sở khác ngoài 10 bối cảnh toán học chuyên môn cao.


Octal thường được sử dụng để xác định giá trị ký tự và đôi khi để kết xuất dữ liệu nhị phân.
Caleb

3

Lý do hợp lệ phổ biến nhất để sử dụng các cơ sở khác là dễ dàng chuyển đổi sang cơ sở 2: việc chuyển đổi số cơ sở 8 hoặc số cơ sở 16 thành nhị phân mà không cần sử dụng máy tính bằng cách ghi nhớ một bảng ngắn gồm tám hoặc mười sáu số:

 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

Điều này mở ra nhiều khả năng:

  • Khi một số đại diện cho một thành phần của các số nhị phân có ý nghĩa, bạn có thể xác định các thành phần riêng lẻ mà không cần máy tính. Ví dụ: nếu số 24 bit đại diện cho một màu trong RGB, thì thật đơn giản để nói đó 0xFF00FFmàu đỏ tươi (Đỏ + Xanh); nhiệm vụ khó khăn hơn nhiều khi bạn được trình bày với16711935
  • Khi một số đại diện cho mặt nạ bit, sẽ thực tế hơn khi viết nó thành một số hex nhỏ gọn, thay vì số nhị phân dài hơn nhiều
  • Một số kiến ​​trúc đã đi theo cách của họ để làm cho mã nhị phân của họ dễ đọc khi được in dưới dạng số bát phân. PDP-11 là một trong những hệ thống như vậy: bit quan trọng nhất sẽ cho phép bạn nói các hoạt động 8 bit từ các hoạt động 16 bit; hai nhóm bát phân cuối cùng sẽ cho phép bạn nói với hai thanh ghi liên quan đến hoạt động, v.v. Tôi biết một số người có thể đọc mã nhị phân PDP-11 khỏi màn hình mà không cần trình dịch ngược, nhưng họ cần mã máy được in trong hệ thống bát phân.

2

Máy tính (hay chính xác hơn là trình biên dịch) không thực sự quan tâm đến số lượng cơ sở bạn sử dụng trong mã nguồn của mình. Các ngôn ngữ lập trình được sử dụng phổ biến nhất hỗ trợ trực tiếp các cơ sở 8 (bát phân), 10 (thập phân) và 16 (thập lục phân). Một số cũng hỗ trợ trực tiếp cho số cơ sở 2 (nhị phân). Các ngôn ngữ chuyên ngành cũng có thể hỗ trợ các cơ sở số khác. (Bằng cách "hỗ trợ trực tiếp", ý tôi là họ cho phép nhập số trong cơ sở đó mà không cần dùng đến các thủ thuật toán học như bẻ khóa, nhân, chia, v.v. trong chính mã nguồn.0xtiền tố số và bộ chữ số thập lục phân thông thường 0123456789ABCDEF. Bây giờ, các thủ thuật như vậy có thể hữu ích để làm cho số dễ hiểu hơn trong ngữ cảnh, nhưng miễn là bạn có thể diễn đạt cùng một số mà không có chúng, làm như vậy - hoặc không - chỉ là một sự tiện lợi.)

Tuy nhiên, cuối cùng, điều đó là không quan trọng. Giả sử bạn có một tuyên bố như sau:

int n = 10;

Mục đích là tạo ra một biến số nguyên và khởi tạo nó với số thập phân 10. Máy tính nhìn thấy gì?

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

Trình biên dịch sẽ mã hóa cái này và nhận ra rằng bạn đang khai báo một biến kiểu intcó tên nvà gán cho nó một số giá trị ban đầu. Nhưng giá trị đó là gì?

Đối với máy tính và bỏ qua các vấn đề sắp xếp và căn chỉnh byte, đầu vào cho giá trị ban đầu của biến là 0x31 0x30. Điều này có nghĩa là giá trị ban đầu là 0x3130 (12592 trong cơ sở 10)? Tất nhiên là không. Trình phân tích cú pháp ngôn ngữ phải tiếp tục đọc tệp trong mã hóa ký tự được sử dụng, để nó đọc 1 0theo sau bởi dấu kết thúc câu lệnh. Vì trong ngôn ngữ này, cơ sở 10 được giả sử, điều này đọc (ngược) là "0 cái, 1 chục, kết thúc". Đó là, một giá trị 10 thập phân.

Nếu chúng tôi đã chỉ định một giá trị theo hệ thập lục phân và ngôn ngữ của chúng tôi sử dụng 0xđể chỉ định rằng giá trị sau nằm trong thập lục phân, thì chúng tôi sẽ nhận được như sau:

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

Trình biên dịch nhìn thấy 0x(0x30 0x78) và nhận ra đó là tiền tố cơ sở-16, vì vậy hãy tìm số cơ sở-16 hợp lệ theo sau nó. Cho đến khi kết thúc câu lệnh, nó đọc 10. Điều này dịch thành 0 "cái", 1 "số sáu", hoạt động thành 16 trong cơ sở 10. Hoặc 00010000 trong cơ sở 2. Hoặc tuy nhiên, nếu không bạn muốn đại diện cho nó.

Trong cả hai trường hợp và bỏ qua việc tối ưu hóa vì đơn giản, trình biên dịch sẽ phân bổ đủ dung lượng để giữ giá trị của intbiến loại và đặt giá trị mà nó đọc từ mã nguồn vào một loại biến giữ tạm thời nào đó. Sau đó, nó (có thể là nhiều sau này) ghi các giá trị nhị phân kết quả vào tệp mã đối tượng.

Như bạn thấy, cách bạn viết các giá trị số trong mã nguồn là hoàn toàn không quan trọng. Nó có thể có ảnh hưởng rất nhỏ đến thời gian biên dịch, nhưng tôi sẽ tưởng tượng rằng (một lần nữa, bỏ qua các tối ưu hóa như bộ nhớ đệm của hệ điều hành) những thứ như nhiễu loạn ngẫu nhiên xung quanh các đĩa xoay của đĩa, thời gian truy cập đĩa, va chạm bus dữ liệu , vv, có tác dụng lớn hơn nhiều.

Điểm mấu chốt: đừng lo lắng về nó. Viết các số trong một cơ sở mà ngôn ngữ lập trình lựa chọn của bạn hỗ trợ và có ý nghĩa đối với cách số sẽ được sử dụng và / hoặc đọc. Bạn đã dành nhiều thời gian hơn để đọc câu trả lời này hơn là bạn sẽ phục hồi trong thời gian biên dịch bằng cách khéo léo sử dụng cơ sở số nào trong mã nguồn. ;)


1

tại sao bất cứ ai cũng đi theo cách của họ để lập trình số trong một cơ sở khác ngoài cơ sở 10.

Đây là một số lý do chưa xuất hiện ...

x00 - API của một số hệ điều hành và thiết bị phần cứng mong muốn các đối số ở dạng hex / binary. Khi bạn mã hóa các API như vậy, việc sử dụng các số có cùng định dạng như API mong đợi sẽ dễ dàng hơn thay vì chuyển đổi giữa các cơ sở khác nhau. Ví dụ, để gửi một kết thúc byte thông báo đến máy chủ hoặc gửi tin nhắn để đóng kết nối với kênh liên lạc.

x01 - Bạn có thể muốn ứng dụng của mình thể hiện các ký tự không có sẵn tại một số bàn phím nhất định, chẳng hạn như dấu hiệu bản quyền (\ u00a9).

x02 - Để duy trì một số hằng số / nghĩa đen (trực quan) trên các cài đặt văn hóa khác nhau, đặc biệt khi mã nguồn / tệp được di chuyển qua các nhà phát triển với các cài đặt cục bộ khác nhau.

x03 - Để làm cho mã của họ trông khó hiểu và phức tạp - Điều tốt là C # không hỗ trợ các hằng số bát phân!


1

Vấn đề chính là đại diện cho một từ duy nhất của kích thước máy tính một cách hợp lý. 6502 là bộ xử lý 8 bit. 4004 là bộ xử lý 4 bit.

Khi làm việc với một số 4 hoặc 8 bit hoạt động độc đáo. Số 4 bit là một ký tự thập lục phân đơn. Một số 8 bit (một byte) là hai chữ số hex. Các hệ thống có sức mạnh từ 2 kích thước là tiêu chuẩn thường thấy hiện nay - 16 bit, 32 bit, 64 bit. Tất cả các số này chia cho 4 độc đáo để biểu diễn dưới dạng thập lục phân.

Octal (cơ sở 8) đã được sử dụng trong các hệ thống có kích thước từ là 12, 24 hoặc 36. PDP8, Mainframe của IBM và ICL 1900 ngày trước đã sử dụng những từ này. Những từ này được biểu diễn dễ dàng hơn bằng cách sử dụng các octet thay vì một phạm vi thập lục phân giới hạn (vâng, chúng cũng chia thành 4).

Rõ ràng cũng có một khoản tiết kiệm chi phí với việc sử dụng đánh số cơ sở 8. Đại diện cho 12 bit trong BCD, chữ số đầu tiên chỉ có thể là 0-4 nhưng chữ số thứ hai, thứ ba và thứ tư có thể là 0-9. Nếu điều này được thực hiện dưới dạng hex, một có 3 ký tự hex, nhưng mỗi ký tự có 16 giá trị có thể. Nó rẻ hơn khi sản xuất một ống nixie chỉ có 0-7 so với ống có 0-9 (với logic bổ sung cho BCD) hoặc 0-F cho thập lục phân.

Ngày nay, người ta vẫn thấy bát phân với các quyền unix (755, 644) trong đó chủ sở hữu, nhóm và thế giới mỗi người có 3 bit đại diện cho các quyền.


Trong thế giới toán học, thỉnh thoảng người ta làm một số điều kỳ lạ với các cơ sở khác nhau. Ví dụ, một chuỗi Goodstein yếu từ dự án euler 396 ... hoặc một cái gì đó đơn giản hơn với các số palindromic . Có một thuộc tính của một số trong cơ sở N là một số là bội của N - 1 sẽ có các chữ số của nó tổng bằng bội số của N - 1 . Furtermore, nếu N - 1 là một hình vuông hoàn hảo, thuộc tính này cũng tồn tại cho sqrt ( N - 1 ). Điều này có một số ứng dụng trong các vấn đề toán học nhất định.


1
Octal là do PDP có 9/18 byte, số bát phân biểu thị 3 bit nên nếu byte của bạn chia hết cho 3 thì sẽ rất có ý nghĩa
Martin Beckett

1
Octal cũng được sử dụng trên một số hệ thống 16 bit (đáng chú ý nhất là PDP-11), vì 15 - số bit ngoại trừ bit dấu - phân chia độc đáo thành 3. Nó được sử dụng rộng rãi trên hệ điều hành UNIX gốc (ví dụ: "od" là công cụ tiêu chuẩn để kết xuất các tệp nhị phân và định dạng mặc định của nó là bát phân 16 bit thay vì hex 8 bit), không chỉ cho quyền. Cũng có thể có liên quan rằng tập lệnh PDP-11 có hai trường toán hạng 6 bit.
Random832

Octal cũng được sử dụng vì nó có thể hiển thị trên công nghệ vào thời điểm đó. Ống Nexi, có ai không? Hoặc màn hình 0-9 khác? Phải mất một lúc để màn hình AF hiển thị.
Jeremy J Starcher

1

Trong ngành tài chính, có một sơ đồ định danhcơ sở hiệu quả 36 . Nó sử dụng các số 0-9 và các chữ cái BZ để biểu thị các chữ số có giá trị 0-35. Nó bỏ qua các nguyên âm để ngăn chặn bất kỳ tên đáng ghét nào được tạo ra.

Nó không hoàn hảo, tuy nhiên. Đã có lúc một công ty không may có id B000BZ.


1

Lý do # 1: bởi vì tất cả các số ở cấp độ mạch được biểu diễn trong cơ sở-2 (công tắc điện được bật hoặc tắt). Lý do # 2: bởi vì ở một cấp cao hơn các mạch thực tế, các bit được nhóm thành byte và byte có thể dễ dàng được biểu diễn dưới dạng hai chữ số thập lục phân, khi nó sẽ lấy 3 chữ số thập phân (và một số xác thực) để biểu thị tất cả các giá trị có thể có của byte.

Vì vậy, nếu bạn đang làm việc ở các cấp độ này (hoặc xấp xỉ chúng, trong một số môi trường được quản lý), sẽ dễ dàng làm việc ở dạng nhị phân hoặc thập lục phân hơn thập phân. Các tình huống trong đó bạn sẽ làm điều này rất đa dạng, nhưng thường không bao giờ là tình huống mà bạn chỉ cần số học cơ bản.


1

Một lĩnh vực mà các số cơ sở 16 (thập lục phân) được sử dụng rất thường xuyên là trong việc chỉ định màu, đặc biệt là khi sử dụng HTML / CSS cho web. Các màu chúng tôi sử dụng trên màn hình kỹ thuật số được chỉ định bằng cách sử dụng kết hợp 3 giá trị cường độ cho 3 màu "cơ bản" (RGB - đỏ, xanh lục, xanh lam) được pha trộn với nhau để tạo ra bất kỳ 16 triệu màu hiển thị nào (sử dụng màu 24 bit ).

Ví dụ, màu xanh lá cây cường độ đầy đủ trong hex sẽ là 0x00ff0065280ở dạng thập phân. Bây giờ hãy tưởng tượng bạn đang cố gắng "tự tay" trộn một màu trong đầu có các phần bằng nhau màu đỏ và xanh lam, nói ở cường độ một nửa, để tạo ra một màu tím đẹp :) Trong hex, điều này sẽ được viết đơn giản như 0x800080trong khi giá trị thập phân cho điều này sẽ là 8388736. Nó thậm chí còn dễ dàng hơn khi làm việc với các sắc thái của màu xám - 50% màu xám là 0x808080(hex) và 8421504(thập phân), 75% là 0xC0C0C012632256, v.v.

Sử dụng hex trực quan hơn nhiều và bất kỳ ai quen thuộc với việc sử dụng màu này sẽ ngay lập tức có thể "đoán" màu chỉ bằng cách nhìn vào giá trị hex. Nó cũng ít bị lỗi hơn khi sử dụng nếu bạn cần sử dụng cùng một màu nhiều lần (thường là trường hợp này).

Kiểm tra bất kỳ trang web nào (và đặc biệt là CSS) để biết lượng sử dụng hex khủng khiếp: D

LƯU Ý: Trong CSS, các giá trị hex được viết bằng #tiền tố, ví dụ: #00ff00cho màu xanh lá cây và đôi khi cũng được rút ngắn chỉ còn ba chữ số, chẳng hạn như #0f0cho màu xanh lá cây.


0

Đối với một số thuật toán, cơ sở 2 có ý nghĩa hơn bất kỳ thứ gì khác. Ví dụ, bạn muốn viết một hàm để duyệt qua cây nhị phân hoặc cây 10 ary?

Nhưng, thường xuyên hơn, cơ sở 2 được sử dụng vì đó là cách máy tính gần như đại diện cho số của chúng. Điều này có nghĩa rằng:

  • nhiều hoạt động hiệu quả hơn trong cơ sở 2:
    • phép nhân, phép chia và phép đo modulo của 2 nhanh hơn nhiều so với phép chia chung
    • cờ và giá trị nhỏ có thể được lưu trữ, truy xuất và thao tác hiệu quả hơn dưới dạng chữ số nhị phân của một số lớn hơn.
  • các hoạt động đọc, ghi và thao tác các tệp dữ liệu và luồng dữ liệu mạng phải xử lý trực tiếp với thực tế là chúng được biểu diễn dưới dạng số nhị phân.

Ngoài ra, luôn có ứng dụng hiếm hoi vốn yêu cầu một cơ sở kỳ lạ có thể không phải là 2 hoặc 10.


2
Tất nhiên tôi sẽ sử dụng cây 10 lá. 2Nhân vật kỳ lạ này bạn đang sử dụng là gì?
CodeInChaos

0

Đó là sở thích trung thực, nếu vì một lý do nào đó, bạn đã bị đa nang và có 11 ngón tay hoặc thích đếm bằng ngón chân để bạn thích làm việc ở cơ sở 20, điều đó hoàn toàn phụ thuộc vào bạn. Nhưng nhận ra rằng trong một chủ đề phổ quát mà hầu hết chúng ta phải xử lý bit và byte hàng ngày sẽ thực sự bị đánh dấu nếu chúng ta nhận được một cái gì đó đang thao túng bit trong cơ sở 19.

LÝ DO CƠ SỞ x

Cơ sở 10 - Mô hình của tất cả nội dung của chúng tôi vì chúng tôi có 10 chữ số đếm (bàn chân kỳ lạ và có mùi nên chúng tôi không sử dụng chúng).

Cơ sở 2 - Máy tính sử dụng điều này cho các bit (bật / tắt) điều này có liên quan đến các mức điện áp có thể đọc được được truyền bởi các cổng / bóng bán dẫn / tụ điện.

Cơ sở 8 - Cũ, trở lại khi máy tính không quá lớn (hoặc quay lại khi chúng khôn ngoan về không gian) điều này tốt cho thứ này hoặc thứ khác (tôi không thích nó một chút)

Cơ sở 16 - Tốt để hiển thị các nút trên và dưới của một byte để thao tác bit. Điều này là siêu hữu ích trong thế giới nhúng / fpga / phần cứng.

CĂN CỨ BÌNH THƯỜNG TRONG MÁY TÍNH

Để đi theo sở thích, tôi có thể cho bạn biết chính xác mức độ "bật" của một màu trong giá trị RGB hex được cung cấp cho tôi, do đó, điều này có thể được biểu thị trong một int trong phần cứng và sau đó với một số thay đổi có thể được trả lại cho tôi dễ dàng, 1 màu phức tạp = 1 điểm dữ liệu rất tốt cho xử lý hình ảnh lớn với bộ nhớ hạn chế. So sánh với đại diện cơ sở 10, bạn có thể thêm tất cả chúng và lưu trữ chúng trong một số, nhưng số đó là gì, hoặc có thể R là thời gian 10000, G là 100 và B là không gian riêng của nó, đó là rất nhiều phép toán , thông thường các phép nhân có chi phí nhiều chu kỳ hơn một ca, vì vậy phần dữ liệu tiếp theo của bạn đã được xếp hàng trước khi bạn thực hiện xong phần cuối cùng của bạn đang được xử lý, rất tiếc, điều đó đã biến mất ngay bây giờ.

Đôi khi chỉ tốt hơn khi làm việc ở cơ sở 2, 8 hoặc 16. Với hầu hết các máy, nhân với 2 chỉ là một chút thay đổi, những máy này siêu tốc độ, tương tự với cách chia 2.

Để giải thích hơn nữa về ý tưởng của twiddling. Có một số lượng lớn thời gian khi làm việc trong môi trường nhúng mà tôi cần để truy cập vào một số mảng đèn, công tắc hoặc một số mục ánh xạ đăng ký khác.

Trong trường hợp này, việc gán toàn bộ char, byte hoặc int cho mỗi công tắc sẽ không hiệu quả và ngớ ngẩn, một công tắc hoặc đèn có 2 vị trí - bật và tắt - tại sao tôi lại chỉ định một cái gì đó có tới 256 vị trí, hoặc 2 ^ 16 vị trí, v.v ... Mỗi ánh sáng trong một mảng có thể là 1 bit phù hợp 8 hoặc 16 hoặc 32 hoặc 64 hoặc 128 (chiều rộng của kiểu dữ liệu của bạn) trên một từ / thanh ghi. Hiệu quả không gian là cần thiết và khá hoan nghênh.

Sử dụng bất cứ thứ gì có cơ sở 2 ^ n trong lập trình cho những việc như xử lý dữ liệu RGB, nhiều dữ liệu tín hiệu - GPS, âm thanh, ascii, v.v. - đơn giản hơn nhiều trong hex, nhị phân và bát phân vì đó là cách nó được thể hiện trong máy và người ta có thể dễ dàng nhận ra những gì đang được trình bày và cách thao tác nó.

SỬ DỤNG CƠ SỞ CHIẾN LƯỢC

Không có hiệu quả trừ khi bạn mã cho nó. Bạn muốn cơ sở 11, bạn phải thiết lập kiểu dữ liệu cho nó và quá tải bất kỳ toán tử nào để xử lý biểu diễn của nó cho người dùng. Tôi thấy không có lý do tại sao một hệ thống giữ 5 mục và chỉ cần giữ nhiều bội số của 5 mục sẽ cần phải được chuyển đổi thành năm mục toán. Và hơn nữa, bạn nên cầu nguyện rằng bất kỳ ai quyết định viết mã của họ cho cơ sở 271 đã ghi lại nó tốt hoặc bạn có thể dành nhiều thời gian để hiểu nó hơn là đáng để tạo ra cơ sở 271 vì tất cả các mục là bội số của 271.


0

Quay trở lại thời xa xưa của máy tính, chúng tôi đã có một số màn hình có thể hiển thị các chữ số 0-9, nhưng chúng tôi chưa có AF.

http://ad7zj.net/kd7lmo/images/ground_nixie_front.jpg là một ví dụ như vậy ...

Octal phù hợp thực sự độc đáo trên các màn hình này và dễ dàng hơn so với nhị phân hoặc thập phân.


0

Tôi ngạc nhiên khi tất cả các câu trả lời khác không đề cập đến hai cách sử dụng rất phổ biến trong điện toán cho các cơ sở thay thế:

  1. Mã hóa : Mã hóa Base64 chẳng hạn là cực kỳ phổ biến. Mã hóa chỉ đơn giản diễn giải một chuỗi byte dưới dạng số nhị phân lớn (cơ số 2) và chuyển đổi số đó thành số Base64 được biểu thị bằng các chữ số ASCII.
  2. Nén : Thường mong muốn đại diện cho số nhị phân, số thập phân hoặc số hex trong một cơ sở lớn hơn để rút ngắn đại diện. Ví dụ, tất cả các công cụ rút ngắn bit như bit.ly đang làm điều này. Hoặc bạn có thể làm điều đó để rút ngắn GUID để sử dụng trong URL.

    - 821F6321-881B-4492-8F84-942186DF059B (base-16 guid) 
    becomes
    - RRIDHW463YD8YXX7MIDI (base-36)
    - 3UFmaWDjj9lifYyuT0 (base-62)
    
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.