Trường hợp nào là hữu ích? [đóng cửa]


36

Tôi chỉ đập đầu vào bàn trong khoảng 20 phút để xem xét một lỗi hoàn toàn kỳ lạ trong PHP, và rồi tôi nhận ra có bát phân. Số bát phân <% (* & #>.

Nói tóm lại, tôi đã đệm một số chữ bằng số không để mã được căn chỉnh, tôi biết, sai lầm lớn. Quên về quãng tám.

Câu hỏi là, có ai sử dụng bát phân cho bất cứ thứ gì ngoài quyền truy cập tệp không? (Cá nhân tôi thích chmod ugo+rwxnhưng tôi hiểu rằng nếu chúng phải được lập trình theo chương trình, thì việc sử dụng bát phân sẽ hữu ích.) Nhưng chúng có hữu ích trong bất kỳ tình huống nào khác không?


16
Lựa chọn A: Tự trách mình. Lựa chọn B: Đổ lỗi cho thế giới. Tùy chọn C: cười thầm khi bạn đã học được điều gì đó.
Công việc

12
@Petrozza - IMO việc sử dụng kiểu số 0 của số 0 hàng đầu để biểu thị bát phân không bao giờ là một lựa chọn tốt, nhưng đó là lịch sử - có thể là một chút di sản C, mặc dù nó có thể còn cũ hơn. Tôi nghĩ Ada có một trong những quy ước tốt hơn - một số bát phân sẽ được viết 8 # 1234567 #, số hex 16 # abcdef #, v.v. và tất cả đều rõ ràng và dễ hiểu.
Steve314

2
@Petruza Câu hỏi của bạn ở dạng ban đầu không mang tính xây dựng cho trang web này và nó đã được cộng đồng cải thiện để nó vẫn mở: vui lòng xem Câu hỏi thường gặp để biết thêm thông tin về lý do mọi người làm điều này và tại sao chúng tôi khuyến khích nó. Nếu bạn có thêm bất kỳ câu hỏi hoặc thắc mắc nào, vui lòng nêu chúng trên trang web thảo luận meta của chúng tôi , không phải trong câu hỏi của bạn.

11
Tùy chọn D: "đổ lỗi cho PHP" luôn là lựa chọn đúng đắn, bất kể vấn đề là gì
Cephalepad

2
@ Steve314 Tôi hoàn toàn đồng ý. Một ví dụ đáng chú ý khác là Python nơi chúng có 0otiền tố (phù hợp với 0x0bcó lẽ hơi khó phân biệt 00). Và kể từ Python 3, các số 0 dẫn đầu thêm là lỗi cú pháp để ngăn loại lỗi này.
5gon12eder

Câu trả lời:


42

Theo Wikipedia , quãng tám không phổ biến như trước đây. Như những người khác đã đề cập, trước đây, các hệ thống thường có từ 12/24/36 bit, được biểu diễn dễ dàng hơn trong bát phân so với thập lục phân, nhưng hiện tại, các kiến ​​trúc x86 và i64 sử dụng bit 16/32/64 từ, được thể hiện dễ dàng hơn trong thập lục phân và hết sức xấu xí trong bát phân.

Tuy nhiên, việc sử dụng hiện tại bao gồm:

Lưu ý rằng các ngôn ngữ lập trình hiện đại đôi khi không hỗ trợ quãng tám nữa vì thiếu trường hợp sử dụng và khả năng xảy ra lỗi. C # là một ví dụ, như Eric Lippert đã viết điều này trong phiên bản thứ 3 và thứ 4 của TCPL :

C # không hỗ trợ chữ bát phân, vì hai lý do. Đầu tiên, hầu như không ai sử dụng chữ bát phân ngày nay. Thứ hai, nếu C # được hỗ trợ bát phân theo định dạng "hàng đầu không có nghĩa là bát phân" tiêu chuẩn, thì đó sẽ là một nguồn lỗi tiềm ẩn. Hãy xem xét mã này:

    FlightNumber = 0541;

Rõ ràng biểu thức này được dự định là một chữ thập phân chứ không phải là một chữ bát phân.

Liên quan và chỉ để tham khảo và tò mò, Code, Ngôn ngữ ẩn của phần cứng máy tính có một lời giải thích dễ thực hiện tuyệt vời trên bát phân và các hệ thống số khác ở trang 55 - 63 .


1
Trên lưu ý đó, coi chừng Javascript khi xử lý đầu vào của người dùng. parseInt(011)==9
Darien

3
Điều đó thực sự thú vị về Yuki và Pamean. Tôi nhận ra rằng việc đếm ngón tay thập lục phân khá dễ dàng, nếu bạn sử dụng mặt trong của mỗi ngón tay, sử dụng một số biến thể, như thế này
ocodo

@Slomojo - trên thực tế, bạn có thể đếm đến 99 trên ngón tay của mình ...
đáng ghét

3
+1 cho câu trả lời rất toàn diện. Grace Hopper đã từng nói rằng cô ấy gặp khó khăn trong việc cân bằng sổ séc của mình, bởi vì cô ấy đã trở nên rất thành thạo trong việc thêm vào bát phân.
Macneil

14
@detly, nếu tôi biết tôi cần đếm số lớn, tôi sẽ sử dụng 10 chữ số của mình dưới dạng bit và đếm đến 1024 chỉ bằng ngón tay của mình (chỉ cần cẩn thận với những người bạn hiển thị # 4, # 128 & # 132 đến).
zzzzBov

17

Octal đã được sử dụng rộng rãi khoảng 50 năm trước bởi Digital Equipment Corp (DEC) và các công ty khác có máy tính có từ 12 bit (ví dụ PDP-8) hoặc các bội số khác của sáu, như 18 và 36 (ví dụ UNIVAC 1108 ). Tôi đã sử dụng cả PDP-8 và UNIVAC 1108 ở trường học. Các ký tự trong cả hai máy thường sử dụng sáu bit, không phải 8.

Định dạng lệnh PDP-8

Định dạng lệnh PDP-8 - lưu ý các bit được đánh số 0 -> 11. Bit 0 là MSB (bit quan trọng nhất).

Khi DEC ra mắt với PDP-11 16 bit, họ tiếp tục sử dụng bát phân trong tài liệu của họ thay vì thập lục phân như được sử dụng bởi các nhà sản xuất máy tính mini khác ra mắt với máy 16 bit vào thời điểm đó. Điều này có thể là do có nhiều trường 3 bit trong các định dạng lệnh PDP-11 như Đăng ký, Chế độ và Src / Dest cho vay để được giải mã dưới dạng một chữ số bát phân. (Cám ơn John Strohm đã chỉ ra điều này.)

Thật thú vị, khi Motorola ra mắt với bộ vi xử lý 68000 của họ, vốn chịu ảnh hưởng nặng nề bởi PDP-11 và có cùng các trường Chế độ và Đăng ký 3 bit trong hướng dẫn, họ đã chọn chỉ sử dụng thập lục phân trong tài liệu của họ.

Bởi vì PDP-11 đã sử dụng ký hiệu bát phân, mã cấp phép ban đầu cho Unix, lần đầu tiên xuất hiện trên PDP-11, cũng được sử dụng bát phân. Di sản này vẫn tồn tại trong Linux, trong đó lệnh chmod vẫn sử dụng bát phân để chỉ định từng trường trong ba trường 'rwx'.

Một số câu đố khác - CompuServe, một dịch vụ trực tuyến quay số được sử dụng rộng rãi vào những năm 1980 và đầu những năm 1990 (trước khi bị AOL làm lu mờ), ít nhất là chạy trên máy tính mini của DEC, ít nhất là ban đầu. Tất cả ID người dùng đều là số và tại một số điểm, tôi đã quan sát thấy rằng họ không bao giờ bao gồm bất kỳ số 8 hoặc 9 nào trong đó, do đó họ ở dạng bát phân. ID CIS cũ của tôi là 70205.


1
Nhận xét của bạn về tài liệu PDP-11 là không chính xác. PDP-11 có 8 thanh ghi. R0-R5 là các thanh ghi mục đích chung. R6 là con trỏ ngăn xếp và R7 là PC. Lệnh MOV lấy hai số thanh ghi 3 bit và hai chế độ địa chỉ 3 bit. Octal chụp các trường đăng ký và chế độ HOÀN HẢO. (Tôi hoàn toàn nghi ngờ rằng đây là một tai nạn.) Sử dụng hex sẽ làm mọi thứ bối rối. PUSH và POP chỉ xử lý các chế độ sử dụng R6. Toán hạng ngay lập tức là chế độ địa chỉ sử dụng R7.
John R. Strohm

@ JohnR.Strohm Cảm ơn bạn đã bình luận lại các thanh ghi 3 bit. Tôi đồng ý với phân tích của bạn và đã cập nhật câu trả lời của tôi.
tcrosley

Vì vậy, DEC đã làm việc trong OCT. Nên chỉ sử dụng bội số của 3,32 bit để tránh nhầm lẫn.
user234461

Thật buồn cười khi tôi chưa bao giờ coi các quyền Unix là một số bát phân, tôi luôn nghĩ đó là ba chữ số riêng lẻ được viết cùng nhau, mỗi số đại diện cho ba bit rwx, vì vậy chúng có thể là số bát phân, thập phân hoặc thậm chí là hex.
axl

11

Heathkit đã sử dụng chúng cho bảng mặt trước của H-8 và cho danh sách ngôn ngữ lắp ráp của phần mềm bảng mặt trước của họ (được gọi là PAM-8). Hẹn hò với chính mình, tôi biết.

nhập mô tả hình ảnh ở đây

Ngày nay các quãng tám rất hiếm; mọi người dường như sử dụng hex. Nhưng các số vẫn trông giống như các số trong bát phân và bạn không cần thêm một hàng phím cho các chữ số từ A đến F.


2
+1 cho H-8. Mặc dù là bát phân ở bên ngoài, CPU là 8080A, tất cả đều là byte. Đi xì hơi.
Blrfl

Tôi đoán họ đã sử dụng bát phân cho điểm chung với H-11 (có CPU PDP-11).
Jerry Coffin

2
8080 có byte 8 bit, nhưng tập lệnh có ý nghĩa hơn nếu nhìn vào bát phân so với hex.
RBerteig

6

Một trong những lý do tại sao bát phân thấy sử dụng là bởi vì đó là cơ sở lớn nhất có sức mạnh bằng 2 mà bạn không cần bất kỳ ký tự đặc biệt nào - đó là, tất cả các chữ số có thể là số. Cơ sở 16 (tiếp theo lên từ cơ sở 8) yêu cầu các chữ số không phải là số (thường là A, B, C, D, E, F).


Tôi biết điều này đã cũ, nhưng tại sao chỉ sử dụng các chữ số là thích hợp hơn để sử dụng các chữ cái?
Petruza

5

Tôi sử dụng bát phân mỗi ngày. Mỗi lần tôi cần phải chỉnh sửa một tập tin, tôi sử dụng bát phân (tôi đặt trước ký hiệu u + r ...). Mỗi lần tôi muốn nhúng một ký tự điều khiển bên trong một chuỗi tôi sử dụng bát phân ... (Vâng, tôi có thể sử dụng hex, nhưng bát phân là những gì tôi sử dụng).


2
+1 cho "nhưng bát phân là những gì tôi sử dụng" :)
JoelFan

5

Bất cứ ai cần thể hiện sự kết hợp của các bit được nhóm thành ba.

Tại sao mọi người sử dụng hex?


Những thứ ngoài đỉnh đầu của tôi được thể hiện dưới dạng số bát phân:

  • Các mã bị vặn vẹo bởi các bộ phát đáp Mode 3A trong máy bay
  • Một số giá trị được tìm thấy trên xe buýt hàng không ARINC 429
  • Địa chỉ SCSI
  • Mã khóa trong ncursesthư viện

11
Sự khác biệt là, hex là "tự nhiên" là nửa byte. Hai chữ số hex = 1 byte. Nhưng bạn không thể chia byte thành các chữ số bát phân.
Mason Wheeler

2
Dòng đầu tiên nêu rõ ràng. Cái thứ hai làm cho một sự tương tự nghèo nàn.
back2dos

3
Và hex là hoàn toàn không tự nhiên đối với bất cứ điều gì cần được thể hiện trong các nhóm ba bit như các chế độ tệp Unix đã nói ở trên. Không có luật quy định các chữ số của một hệ thống đánh số cụ thể phải xếp hàng với các byte. Nếu có, việc thể hiện bất cứ điều gì với máy tính là cơ sở 10 sẽ là thực tế tồi tệ hơn so với cơ sở 8, mà ít nhất là tự sắp xếp nó với các nhóm bit.
Blrfl

6
một chuỗi hex điển hình rõ ràng là một chuỗi hex. bát phân không.
Paul Nathan

1
@Blrfl: Vậy có bao nhiêu trong số này được đề cập "[những thứ] cần được thể hiện trong các nhóm ba bit" ngoài ví dụ chính tắc? Đó là câu hỏi thực tế mà bạn chưa trả lời cho đến nay. Thay vào đó bạn thực hiện một tương tự kém. Có sử dụng thực tế cho biểu diễn thập phân, bởi vì chúng tôi chỉ đơn giản là học cách xử lý nó. Cái nào bạn sẽ tính nhanh hơn? 7 * 6hay 07 * 06? Chúng tôi sử dụng số thập phân để biểu thị các số vì chúng tôi có thể xử lý chúng tốt nhất và hex để thể hiện các số rất gần với cách máy lưu trữ chúng. Và chúng tôi làm điều này rất nhiều. Trang web này là đầy đủ với bằng chứng của nó.
back2dos

5

Quay lại khi tôi làm việc trên các máy tính lớn CDC (với một từ 60 bit, 12 bit cho PPU), tất cả các kết xuất lõi và như vậy đã được thực hiện trong bát phân (20 chữ số bát phân cho mỗi từ, 4 chữ số mỗi chữ PPU).


3

Giống như thập lục phân, ký hiệu bát phân đôi khi được sử dụng để chỉ định mã ký tự. Nó có thể hữu ích cho cùng một lý do là thập lục phân là: nó nhỏ gọn hơn nhị phân, nhưng rất dễ dịch sang nhị phân trong đầu bạn.


2

Giống như Hex, số Octal dễ dàng chuyển đổi từ nhị phân. Chỉ cần nhóm các chữ số nhị phân trong nhóm ba, bắt đầu ở bên phải.

10010101110  // binary

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

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

7
Điều này là hiển nhiên. Câu hỏi là khi điều này thực sự được sử dụng .
back2dos

2
@ back2dos: sau đó xin vui lòng gửi câu trả lời thay vì để lại cùng một bình luận nhiều lần.
Ed S.

4
@Ed S. Bạn thậm chí không cố gắng trả lời câu hỏi. Bạn đã nói một điều hiển nhiên rằng người đăng ban đầu gần như chắc chắn đã biết câu trả lời. Vì người điều hành rất thích nói, đây không phải là thứ chúng tôi đang chụp. Xem meta.programmers.stackexchange.com/questions/1968/ cấp để biết thêm.
btilly

@ back2dos, btilly - Câu trả lời trên các trang web Stackexhange không chỉ dành cho OP, chúng trở thành tài nguyên bền bỉ cho bất kỳ độc giả nào đi qua. Tất cả sự thật hiển nhiên , không nhất thiết phải rõ ràng đối với mọi người, nếu câu trả lời này giúp giảm giá cho ai đó thì nó có giá trị.
ocodo

2
@Slomojo mặc dù theo lập luận đó, mọi câu hỏi đều đủ điều kiện để trở thành wiki cho mọi khía cạnh liên quan của một chủ đề. Vấn đề là điều này không trả lời câu hỏi . Câu trả lời này chắc chắn có thể có giá trị ở một nơi khác, để "Làm thế nào để nhanh chóng chuyển đổi tinh thần sang bát phân?"
Nicole

2

Không. Không bao giờ sử dụng chúng. Thậm chí không phải để thiết lập quyền truy cập tệp, bởi vì tôi làm điều đó rất hiếm khi tôi thấy nó khó đọc.

Vì vậy, có, có lợi ích rõ ràng của việc chuyển đổi từ và sang nhị phân.
Tuy nhiên, như đã được @Mason chỉ ra, hex là "tự nhiên" hơn nhiều, bởi vì 2 chữ số hex tạo thành một byte. Tiện dụng để thể hiện màu sắc RGB / ARGB 24/32 bit, địa chỉ IP, mặt nạ byte, v.v ... Mặt khác, thực tế không thực tế, bởi vì bạn hiếm khi có các tình huống khi bạn làm việc theo nhóm 3 bit.

Quyền truy cập tệp trong thực tế là điều duy nhất tôi có thể nghĩ về. Và nếu bây giờ không có khu vực sử dụng, tôi nghi ngờ sẽ không bao giờ có một khu vực. Kể từ khi 20 năm qua không gian trở nên rẻ như vậy, việc đóng gói thông tin rất chặt chẽ, với chi phí liên kết, dễ sử dụng và mở rộng trở nên rất phổ biến.


2

Một chút của một bên, nhưng sử dụng công cộng là trên Tàu điện ngầm Luân Đôn. Mỗi chuyến tàu có cả một danh tính vật lý và một danh tính riêng trong lịch trình được hiển thị khi phục vụ - xem tại đây: https : //upload.wik hè.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg (lưu ý số 402 ở đầu màn hình đích). Mặc dù các thiết bị điện tử cho màn hình hiển thị dựa trên số thập phân tiêu chuẩn, bạn không bao giờ thấy các chữ số 8 hoặc 9 vì chúng được gắn với phần cứng dựa trên bát phân kế thừa trong hệ thống tín hiệu.

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.