Tại sao học thập lục phân? [đóng cửa]


28

Tôi đã tham gia khá nhiều lớp học lập trình giới thiệu trong ngày, chủ yếu chỉ để làm ướt chân trong mọi loại chương trình khác nhau mà tôi tìm thấy. Không có gì đáng ngạc nhiên, chỉ có mỗi lớp chạy qua cùng một định dạng: giới thiệu phần cứng, giới thiệu phần mềm và sau đó bạn tham gia vào chương trình thực tế. Mặc dù hiểu cách thức hoạt động của phần cứng và phần mềm là rất quan trọng, tôi luôn bị nhầm lẫn bởi một chủ đề đã có trong mỗi khóa học.

Trong phần giới thiệu phần mềm tôi đã tìm thấy, không thất bại, họ luôn chú trọng vào việc biết chữ trong các hệ thống số nhị phân, thập lục phân và đôi khi là số bát phân. Tôi hiểu rằng thật tốt khi hiểu những thứ này là gì và máy tính sẽ diễn giải chúng như thế nào, nhưng tôi chưa bao giờ thấy mình thực sự cần biết cách đọc và viết bất kỳ hệ thống số nào trong số đó. Thực sự, lần duy nhất tôi thấy thứ gì đó ngoài cơ sở 10 là màu sắc trong CSS, điều này thậm chí còn dễ dàng hơn nếu bạn sử dụng thứ gì đó như www.colorpicker.com

Có phải tôi đã không biết gì về những công dụng tuyệt vời của các hệ thống số 10 cơ sở này trong thế giới lập trình, hay chỉ là một truyền thống cũ để đưa các phần này vào tất cả các sách giáo khoa lập trình? Có ai có một ví dụ tốt về nơi lập trình viên trung bình thực sự sẽ sử dụng một số bát phân không?


1
Có ai có một ví dụ tốt về nơi lập trình viên trung bình thực sự sẽ sử dụng một số bát phân không? Có, nếu bạn từng thấy mình viết phần mềm liên quan đến ngành Hàng không thì có thể bạn sẽ gặp mã Transponder, đó là một số bát phân 4 chữ số. vi.wikipedia.org/wiki/Transponder_%28aviation%29
Ben Cottrell

Câu trả lời:


14

Tất cả các câu trả lời đều tốt nhưng chúng không giải quyết những gì tôi nghĩ là phần có giá trị nhất. Học cách "Suy nghĩ" trong các cơ sở khác nhau giúp bạn thông thạo hơn rất nhiều với cách máy tính xử lý số.

Nếu bạn muốn lưu trữ một chuỗi các chữ cái viết thường được đóng gói khá tốt, bạn sẽ làm thế nào?

Chà, có 26 chữ cái viết thường, dễ dàng chuyển thành phạm vi 0-31 là số 5 bit, bạn có thể gói 6 số 5 bit vào trường 32 bit (int?) Và thậm chí còn dư cho một vài dấu chấm câu.

Tôi không nói hex giúp với những thứ như thế này, nhưng hiểu cách chuyển đổi số.

Một trường hợp khác, thường thì bạn sử dụng cơ sở 64 để truyền các số hơi dài trong ascii. Bạn có biết làm thế nào để thực hiện điều này? Tại sao thực hiện nó theo cách đó? Bạn thậm chí có nhận ra đó là những gì bạn đã gõ mỗi lần bạn gõ "CD KEY" vào hộp đăng ký của trò chơi không?

Ngoài ra, để giải trí, thỉnh thoảng hãy chơi xung quanh căn cứ 12. Toán học hóa ra thực sự thú vị ở cơ sở 12 (cơ sở 10 là ngu ngốc khi so sánh, tôi ước chúng ta tiến hóa bằng 6 ngón tay - chúng ta có thể đi trước hàng thập kỷ trong sự hiểu biết về toán học). Một số người rất sớm thông minh đã sử dụng cơ sở 12 để phát triển đồng hồ.

Trong cơ sở 10, chúng ta có 3 số "Mát" tạo ra các mẫu dễ dàng, 2, 5 và 9 với 8, 6 và 4 là số mát "Nhỏ". Trong cơ sở 12, bạn có 2,3,4,6,11 là số "mát" với 8,9 và 10 là số mát "nhỏ", nghĩa là nếu chúng tôi sử dụng cơ sở 12, chúng tôi sẽ nhận ra các mẫu trong số tốt hơn nhiều bởi vì chúng ta sẽ được nhìn thấy chúng mọi lúc

Ngoài ra, nhị phân. Bạn có thể đếm bằng một tay đến 32 - Tôi làm điều đó khá nhiều, đôi khi rất hữu ích khi đếm đến 5 chỉ không cắt được :)

Nhị phân là rất nhiều niềm vui, nhưng nó không dịch tốt. Khi bạn trở nên tốt với hex, bạn bắt đầu thấy "A" là 1010 và "5" là 0101, và những điều này bắt đầu thực sự quan trọng. Nếu bạn có một bitfield mà bạn muốn trích xuất bit thứ 6: 00100000, bạn "và" nó với cái gì? Bạn chỉ nên biết rằng đó là 0x20.

Nếu bạn thấy mã và một cái gì đó với 0x0600 thì bit nào đang được trích xuất? Bạn nên biết mà không cần suy nghĩ về nó - bạn thực sự nên đọc nó như thể nó được viết 0000011000000000 (nhưng dễ đọc hơn vì bạn không phải đếm số không).

Tại sao bạn muốn giới hạn bộ não và khả năng xử lý dữ liệu của nó?


Trên thực tế, đồng hồ được phát triển trong cơ sở60 .
Denis de Bernardy

@Denis Tôi có ấn tượng rằng lý thuyết hiện tại là chúng được phát triển bởi một người được tính trong căn cứ mười hai đã thua cuộc với những người ngu ngốc không thể nghĩ rằng đã vượt qua ngón tay của họ. 60 chỉ là 12 bộ phận được chia thành các nhóm 5 và có vẻ như là một vụ hack sau 10 tiếng cằn nhằn :)
Bill K

Có thể là. Thành thật mà nói, tôi không có nghĩa là một chuyên gia. Nhận xét của bạn chỉ mang lại một số bộ nhớ bị lãng quên từ lâu. Tôi cũng nhớ lại rằng các góc đo 360 độ xuất phát từ cơ sở 60 (và bởi cùng một nhà phát minh người Babylon, vào lúc đó), nhưng như bạn chỉ ra, có thể đó là những tiếng lách cách cơ bản 10 chỉ áp đảo những gì ban đầu là các nhà toán học cơ sở 12. :-) Bây giờ, hãy tưởng tượng nếu chúng ta đang đếm ở căn cứ 20, giống như một số người Ấn Độ Mỹ đã làm. :-D
Denis de Bernardy

44

Học gì? Bạn cần hiểu các cơ sở số khác nhau để trở thành một lập trình viên có năng lực, nhưng liên quan đến hex thì có rất ít điều để học, ngoại trừ ABCDEF đến sau 9.


8
OP có thể đề cập đến việc có thể chuyển đổi tinh thần đến cơ sở 10 từ các căn cứ khác. Đây có thể là một kỹ năng hữu ích tại một thời điểm, và vẫn có thể dành cho một loại lập trình viên cấp thấp nhất định, nhưng phần lớn không liên quan ngày nay. Bạn có thể thực hiện chuyển đổi trong vim tầm thường, ví dụ.
Rein Henrichs

Đúng rồi. Tôi cần phải có được rõ ràng hơn.
bộ

2
@Rein Tôi chưa bao giờ giỏi việc đó (tôi phải làm toán trong đầu), vì vậy tôi không thể nói. Tuy nhiên, trước đây tôi thường có khả năng chuyển đổi từ hex sang ngôn ngữ lắp ráp Z80, đây là một điều hữu ích để có thể làm vào lúc đó. Tôi nghi ngờ khả năng chuyển từ trình biên dịch hex sang 80x86 (hoặc bất cứ điều gì) vẫn hữu ích cho các lập trình viên làm việc ngày nay.
Neil Butterworth

1
@Neil Butterworth: 8080 opcodes có ý nghĩa hơn được xem trong bát phân, thực sự, nếu bộ nhớ phục vụ. Bộ nhớ của tôi thực sự mơ hồ về cách áp dụng cho các tiện ích mở rộng Z80 cho nó.
David Thornley

1
@Neil: Tôi nghĩ phần quan trọng là hướng dẫn đăng ký di chuyển để đăng ký, có vẻ như là 01xxxyyy ở định dạng bit, trong đó xxx là nguồn đích và nguồn yyy. Tôi không biết nếu có bất kỳ ý nghĩa bát phân nào khác.
David Thornley

18

Có ai có một ví dụ tốt về nơi lập trình viên trung bình thực sự sẽ sử dụng một số bát phân không?

Octal? Nói chung, không, với một ngoại lệ cho quyền * nix.

Hệ thập lục phân? Bạn đặt cược. Bạn đang bỏ qua số lượng khá lớn trong số chúng ta đang xáo trộn các bit xung quanh các hệ thống nhúng, xem xét các giao thức hoặc định dạng tệp ở cấp độ bit, et cetera. Nhưng chắc chắn, nếu bạn ở xa ứng dụng kim loại hoặc làm việc trên web, bạn có thể thoát khỏi nó dễ dàng hơn.

Ví dụ: Các thanh ghi cấu hình trên vi điều khiển và tương tự.

Lấy số 54312, lấy bằng các phím bấm ngẫu nhiên. Bạn có thể cho biết những bit nào được thiết lập? Tôi không thể, ít nhất là không ra khỏi đỉnh đầu của tôi. Tương đương thập lục phân, đó là 0xd428. Cái đómặt khác, cho tôi biết ngay rằng mẫu bit tôi đang xem là 1101 0100 0010 1000. Nó được cấu trúc logic hơn cho loại điều đó và bạn thấy mình cần điều này mọi lúc khi bạn ở gần kim loại. Giả sử con số trên là những gì tôi nhận được khi thiết lập lại từ mcu và tôi cần một số bit 7 và 9 vì một số lý do. Trong hex, tôi có thể dễ dàng thấy rằng số kết quả phải là 0xd6a8, nhưng ở dạng thập phân? Đó là 54952, không nơi nào trực quan nếu bạn hỏi tôi. Chắc chắn, đó là vấn đề thêm 640 vào giá trị, nhưng thật khó để tìm ra. Tất nhiên, trong thực tế, người ta có thể chỉ cần thay đổi bit đến vị trí chính xác và HOẶC với giá trị ban đầu, nhưng bạn vẫn có thể muốn biết đại diện cuối cùng là gì.


1
Loại câu hỏi nào cho câu hỏi "tại sao tôi nên quan tâm bit nào được đặt?" Đối với một số (nhiều? Hầu hết?) Ứng dụng này không liên quan.
Neil Butterworth

10
Đồng ý - giả sử chúng ta đang nói về sự phát triển cấp cao. Mức thấp, cho dù một bit cụ thể được thiết lập hoặc xóa không chỉ có thể, mà đôi khi sẽ xác định xem liệu micro khởi động có máu hay không, hoặc nếu một thiết bị ngoại vi nào đó bạn cần có năng lượng, hoặc nếu nó chạy ở tốc độ đồng hồ x chứ không phải y . Đó mới chỉ là khởi đầu của nó, và nếu bạn đối phó với kiểu phát triển này, về cơ bản, các bit đơn lẻ có vấn đề. Đôi khi rất nhiều. Nhưng một lần nữa, nó phụ thuộc vào tên miền của bạn, tôi chỉ nói; Đừng quên thế giới nhúng. =)
n42

1
+1 - càng gần máy bạn càng nhận được nhiều nhu cầu sử dụng các cơ sở khác nhau. Nó không chỉ được nhúng; hầu hết các ngôn ngữ đều có cờ bit và chúng thường được viết bằng hex vì những lý do rõ ràng. Ngược lại, việc dạy một khóa học lập trình đầu tiên là khá vô nghĩa, nhưng sau đó hầu hết các khóa học lập trình đầu tiên đều khá vô nghĩa. Hầu như tất cả các lập trình viên đều tự dạy mình phải không?

1
@Davor: Đó là vì hex dễ đọc hơn. Tôi có thể hiểu được giá trị hex 8 chữ số nhanh hơn rất nhiều so với giá trị nhị phân 32 chữ số.
Steve S

2
@Steve S: Thành thật mà nói, tôi nghi ngờ đó là vì chúng tôi là một nhóm lười biếng, cũng vậy .. 0x80 ngắn hơn để viết hơn 0b10000000. Nhưng tôi đồng ý. Tôi cũng đồng ý rằng nó hầu như vô nghĩa trong khóa học lập trình đầu tiên, nhưng bạn có thể chuyển nó thành các môn toán rời rạc, lập trình thời gian thực, tổ chức máy tính và những thứ tương tự.
n42

12

Có ai có một ví dụ tốt về nơi lập trình viên trung bình thực sự sẽ sử dụng một số bát phân không?

Nếu bạn đang đặt quyền trên một tệp trong Unix (hoặc Linux), bạn sử dụng số bát phân 3 chữ số. Chữ số đầu tiên là quyền của người dùng, thứ hai là quyền của nhóm và chữ số cuối cùng là quyền mà mọi người khác có được.

Tôi đã phải hiểu thực tế này trong mã mà tôi đã viết tuần trước.

Nếu bạn nhìn vào đầu ra của các thuật toán băm tiêu chuẩn như MD5, bạn sẽ thường thấy chúng được viết bằng hex. Tôi đã thấy một số trường hợp điều này dẫn đến số học trong các cơ sở bất thường.

Nếu bạn muốn hiểu làm thế nào dấu phẩy động được thể hiện bên trong, và do đó tại sao 1/10 không được biểu diễn chính xác, bạn hoàn toàn cần phải hiểu cách thực hiện số học trong các cơ sở khác nhau. Đây là kiến ​​thức bí truyền cho đến ngày nó cắn bạn ở phía sau và đột nhiên bạn thực sự cần phải hiểu nó một cách vội vàng.

Và có một tấn của các trường hợp khác, nơi bạn sẽ tìm thấy bản chất nhị phân cơ bản của bên dữ liệu của máy tính xén lên. Tất nhiên, nếu bạn chỉ viết một trang web CRUD, bạn sẽ không bao giờ gặp phải bất kỳ vấn đề nào trong số đó vì nó xảy ra ở cấp độ mà người khác đã xử lý.


4
* quyền nix không phải là bát phân thực. Bạn không thực hiện các phép tính toán học với các biểu diễn này. Tốt nhất họ là đại diện bát phân của mặt nạ nhị phân.
Joel Etherton

@Joel Etherton: Khi bạn nhận được các quyền từ một stat tệp, chúng xuất hiện dưới dạng số mà theo mặc định sẽ hiển thị trong cơ sở 10. Nếu bạn không hiểu chuyển đổi sang / từ bát phân, những con số đó thật khó hiểu. Tôi đã viết tài liệu cần thiết để giải thích sự thật này. Có rất nhiều phép tính toán học.
btilly

@btilly: Bạn hiểu nhầm những gì tôi đang nói. Nếu bạn đặt quyền trên một tệp thành 755, bạn sẽ không phải thêm quyền này vào bất cứ điều gì. Nó chỉ là một mặt nạ mô tả các kết hợp cho phép. Chắc chắn bạn phải nhận ra rằng nó có nghĩa là (4 + 2 + 1) (4 + 0 + 1) (4 + 0 + 1), nhưng đây vẫn chỉ là những đại diện của mặt nạ nhị phân. Bạn đang đề cập đến điều gì khi bạn nói "tập tin stat"? Tôi chưa bao giờ thấy một thống kê tệp cho các quyền được phân phối trong cơ sở 10 (tuân thủ nghiêm ngặt ví dụ đó).
Joel Etherton

1
@Joel Etherton: Hãy thử perl -le '@stat = stat(shift); print $stat[2]' some_filevà bạn sẽ nhận được một số liệu dưới dạng số trong cơ sở 10. Bạn cần chuyển nó vào Perl chmodtheo cách tương tự. Do đó, việc lưu trữ số theo cách đó trong cơ sở dữ liệu là điều hợp lý, tại thời điểm đó tôi cần ghi lại những số đó phải làm gì với các quyền Unix quen thuộc hơn. Như tôi đã nói, đây không phải là một ví dụ giả định.
btilly

@Joel Etherton: giả sử bạn có một tệp có quyền là 419 (thập phân), bạn muốn làm cho tệp có thể thực thi được, nhưng không thể đọc được trên thế giới. Làm thế nào để bạn cần sửa đổi số? Giá trị được trả về trong lệnh gọi C stat () là một số nguyên, cách bạn chọn để in là một vấn đề khác.
Vatine

9

Hy vọng rằng, trong thế giới thực, bạn sẽ không được hỏi về việc chuyển đổi Hex thành nhị phân thành số thập phân. Bạn sẽ có các công cụ theo ý của bạn để chuyển đổi bất kỳ cách nào bạn muốn.

Tôi đồng ý bạn nên có một sự hiểu biết về những gì đang xảy ra, nhưng tại sao phải ghi nhớ khi bạn có thể tìm kiếm nó?

Tuy nhiên, tôi thấy hữu ích khi nhớ các số chính (đối với tôi 0x64 = 100, 0xFF = 255, 0xFFFF = 65535, v.v.) vì chúng xuất hiện rất nhiều.

Tôi có thể đọc lại 8675309 trong nhị phân, hex và bát phân không? Không, nhưng tôi có thể mở ra một công cụ có thể khi tôi cần.


3
Bạn đã quên 57005, thường được sử dụng như constelvis = 57005;
Bevan

5

Điều duy nhất tôi từng sử dụng bát phân là quyền truy cập tệp trên các hệ thống unix.

Hex và nhị phân rất hữu ích nếu bạn thực hiện bất kỳ công việc nào gần với các giao thức dây hoặc gần với truyền dữ liệu kim loại. Về cơ bản, dữ liệu chảy trong hệ nhị phân, được thể hiện tầm thường một cách đơn giản tại một thời điểm dưới dạng hex.

Bạn cũng sẽ thấy rằng các bảng dữ liệu thường trích dẫn các giá trị hex để hiển thị giá trị trong mã như xuất hiện trong biểu dữ liệu.

Nếu bạn sử dụng một trong số chúng, bạn sẽ khá thành thạo trong việc chuyển đổi sang và từ số thập phân trong đầu, ít nhất là cho các giá trị chung.

Tất cả những gì đã nói; Tôi nghi ngờ sự nhấn mạnh nặng nề chủ yếu là lịch sử. Như bạn nói có rất nhiều lập trình viên không có nhu cầu gì khác ngoài số thập phân.


5

Bạn đang thực sự hỏi tại sao học sức mạnh của 2 đại diện số?

Máy tính được tạo thành từ các mạch điện, dòng điện chạy qua các mạch ở hai cấp độ khác nhau, cao và thấp để thể hiện hai cấp độ dòng điện, chúng tôi sử dụng các chữ số nhị phân vì chúng có thể giữ hai trạng thái, một (cao) hoặc không (thấp).

Chữ số nhị phân hình thành các mẫu . Ví dụ: nếu cách duy nhất mà bạn và tôi có thể nói chuyện, là thông qua một mạch, chúng tôi có thể thiết lập rằng nếu bạn muốn gửi cho tôi chữ A, bạn sẽ gửi cho tôi mẫu nhị phân: 1000001. Vì tôi lười , Tôi không muốn ghi nhớ 7 bảy chữ số. Thay vào đó, tôi sẽ sử dụng sức mạnh của hệ thống đánh số 2 để biểu diễn các chữ số nhị phân lớn thành một chữ số nhỏ hơn. Tôi có thể sử dụng 8 (2 ^ 3) hoặc 16 (2 ^ 4).

Như bạn có thể thấy hầu hết các phần cứng và phần mềm máy tính sử dụng biểu diễn nhị phân và con người chúng ta sử dụng sức mạnh của 2 biểu diễn như bát phân và thập lục phân để đọc biểu diễn nhị phân theo cách hiệu quả và không gây đau đớn hơn.

Bây giờ ví dụ về lập trình viên trung bình cần hiểu sức mạnh của 2 biểu diễn:

  1. ASCII
  2. Unicode
  3. Hiểu lập trình quản lý bộ nhớ (stack, heap, địa chỉ bộ nhớ, bãi chứa lõi)
  4. Gỡ lỗi
  5. Đọc dữ liệu nhị phân được thực hiện trên hầu hết trong trình soạn thảo Hex.

Bây giờ là hai xu cuối cùng của tôi, tôi rất tự tin rằng bạn có thể học khá nhanh bất kỳ sức mạnh nào của 2 đại diện (vì bạn đã quản lý các khóa học lập trình giới thiệu) .. Bạn có thể quên chuyển đổi, nhưng bạn không nên là một khái niệm xa lạ nếu bạn muốn để trở thành một lập trình viên trung bình.


3

Tôi chưa bao giờ sử dụng bát phân nhưng không có gì lạ khi thấy hex trong trình gỡ lỗi và đôi khi việc sử dụng hex trong mã nguồn của bạn sẽ rất có ý nghĩa (thông thường, vì dữ liệu cơ bản là cờ bit.)


3

Tôi không biết ngày nay có cần nhiều không, nhưng nhiều năm trước, khi tôi còn là Lập trình viên Hệ thống, việc có thể đọc và hiểu hex là điều cần thiết. Tôi sẽ được trình bày với một kết xuất lưu trữ (tất cả bằng hex) và giải mã biểu diễn hex trở lại ngôn ngữ hội của IBM. Sau khi làm điều đó một lúc, cuối cùng bạn có thể làm điều đó trực tiếp - đọc hex và viết lắp ráp tương đương. Rất tiện dụng để gỡ lỗi. Thêm và trừ các giá trị hex là hữu ích cho việc tính toán bù đắp từ các thanh ghi cơ sở.

Tôi nghi ngờ bây giờ có rất ít nhu cầu về nó trong thực tế, nhưng kiến ​​thức về nó khó có thể là một điều xấu.


Đó cũng là nơi tôi có được các kỹ năng hex của mình. Sau đó, được làm sắc nét khi tôi buộc phải gỡ lỗi mã mà không có trình gỡ lỗi tượng trưng trên VAX / VMS (chúng tôi đã gửi mã cho khách hàng mà không có bất kỳ thông tin biểu tượng nào). Ngày nay, tôi hiếm khi sử dụng nó, mặc dù chúng tôi mã hóa một số thông tin trong một số URL nhất định dưới dạng hex và thỉnh thoảng rất hữu ích để có thể giải mã chúng một cách nhanh chóng.
TomG

3

Nó không phải là "thông thạo" trong việc đọc nhị phân / thập lục phân, nhưng đủ thoải mái để bạn có thể nhanh chóng thực hiện một chuyển đổi tinh thần khi bạn gặp chúng. Hãy tưởng tượng lập trình mà không cảm thấy thoải mái với số học đơn giản, và bạn phải đi đến một máy tính mỗi khi bạn cần nhân hai.

Hệ thập lục phân / nhị phân rất quan trọng vì đây là ngôn ngữ mà máy tính nói. Bạn sẽ luôn gặp nó ở những nơi, đặc biệt là khi trải qua các bài tập gỡ lỗi và dữ liệu của bạn ở dạng hex.

Tôi cũng sẽ nhấn mạnh tầm quan trọng của việc hiểu cơ sở 2 trong bối cảnh các loại số khác nhau được thể hiện trong nội bộ và cách thức số học hoạt động. Với điều này, bạn sẽ nắm bắt tốt hơn về thời điểm và cách xử lý các vấn đề làm tròn điểm nổi và tràn số nguyên, chẳng hạn.

Một ví dụ nữa, các thao tác bitwise và cờ bit vẫn còn phổ biến trong lập trình, và đây là một nơi khác mà sự hiểu biết về cơ sở 2 là quan trọng.


2

Thực sự, lần duy nhất tôi thấy thứ gì đó ngoài cơ sở 10 là cho màu sắc trong CSS,

Bạn chưa bao giờ phải tìm kiếm một ký tự trong biểu đồ mã Unicode ? Chưa bao giờ thấy một URL có %20trong đó? Chưa bao giờ sử dụng GUID ? Chưa bao giờ thấy địa chỉ IPv6 ? Không bao giờ viết một BLOBchữ bằng SQL? Không bao giờ xem một tập tin trong một trình soạn thảo hex? Có rất nhiều thứ liên quan đến máy tính được quy ước là hex.

Đối với bát phân, ngày nay nó rất hiếm, nhưng vẫn được sử dụng cho các quyền của hệ thống tập tin Unix.

Xem thêm: ứng dụng thực tế của hoạt động bitwise

Ngay cả khi bạn có thể tránh thực hiện bất kỳ chương trình "gần với dây" nào, điều quan trọng là phải nhận thức được thực tế rằng máy tính hoạt động theo hệ nhị phân, vì một lý do đơn giản: rò rỉ trừu tượng .

Sự inttrừu tượng trong hầu hết các ngôn ngữ rò rỉ bản chất chiều rộng cố định của nó. Số nguyên tràn, và chúng làm như vậy tại các số nhị phân "tròn" như 2 31 . Một nhà tư tưởng chỉ thập phân sẽ không thể giải thích lỗi năm 2038 .

Các float/ doubletrừu tượng rò rỉ radix của 2. Nếu bạn viết 0.1, bạn thực sự có được 0,1000000000000000055511151231257827021181583404541015625. Và bạn sẽ gặp lỗi nếu bạn mong đợi chính xác 0,1.


2

Nhận biết các số cụ thể có mẫu đơn giản trong các cơ sở khác thường là đầu mối lớn khi giải quyết lỗi. Nếu câu trả lời của bạn sai bởi 347, điều đó có thể không có nghĩa gì cả, nhưng nếu nó bị tắt bởi 256 hoặc 128, có lẽ điều đó có nghĩa gì đó. Nếu bạn đặt -1 vào loại dữ liệu 16 bit không dấu, bạn nhận được 65535, tức là 1 ít hơn 65536. Nếu bạn tình cờ biết 2 ^ 16, bạn sẽ phát hiện ra vấn đề của mình ngay lập tức.

Đối với bát phân, hãy xem những câu hỏi này và xem nếu nhận ra bát phân khi bạn vô tình hỏi nó sẽ làm cho bất kỳ ai trong số những người này lập trình tốt hơn.


1

Có một số kỹ thuật nén dữ liệu và toán học rất hiệu quả mà bạn có thể sử dụng khi bạn hiểu các hệ thống này và cách chúng hoạt động. Bạn có thể sẽ không sử dụng chúng nhiều trong vài công việc đầu tiên của bạn. Nhưng có chúng trong túi sau của bạn khi bạn trở thành đàn anh và bạn được yêu cầu làm cho hệ thống di sản làm việc quá sức chạy trên máy chủ khủng long làm việc quá sức là rất tốt.
Điều quan trọng hơn khi bạn giao dịch với bộ điều khiển và thiết bị điện tử không có api. Đặc biệt nếu bạn đang viết api đó.


1

Trong phần giới thiệu các khóa học lập trình là một phần của nghiên cứu về khoa học máy tính, sẽ rất có ý nghĩa khi biết rõ về tài liệu đó. Bạn xem lại chủ đề khi lập trình bằng ngôn ngữ lắp ráp, khi thiết kế phần cứng, tham gia khóa học về ngôn ngữ chính thức, v.v ... Tất cả các kỹ sư điện tại trường đại học của tôi yêu cầu một khóa học giới thiệu để lập trình và họ có thể sẽ tiếp tục sử dụng thông tin đó. Bên ngoài đó, không quan trọng lắm.


1

Số bát phân đôi khi hữu ích khi giao dịch với bảng mã. Cái sau dựa trên byte và một bát phân = 8 bit = một byte. Ví dụ, trong UTF-8, các ký tự không phải ASCII có thể có hai hoặc nhiều byte; số bát phân thuận tiện hơn để biểu diễn chúng so với số thập lục phân.

Bits rất hữu ích vì ... hey! Bạn có biết rằng máy tính của bạn liên tục xử lý 0 và 1, phải không? Ý tôi là nghiêm túc ... Không chỉ đơn thuần là có thể nói đùa rằng các nhà khoa học máy tính là những người duy nhất biết rằng 1 + 1 = 10. Nó cũng hữu ích cho các nhà khai thác liên quan đến bit hoặc dưới dạng varbits. Cái sau cho phép giảm các yêu cầu lưu trữ trong cơ sở dữ liệu khi xử lý hàng loạt cờ.

Đối với thập lục phân, tôi cho rằng bạn chưa bao giờ mở trình soạn thảo hex để tăng chỉ số và trang bị cho nhân vật RPG của bạn. Bạn đã làm như vậy thay vì tải xuống một trình soạn thảo nhân vật, bạn sẽ biết đầy đủ lý do tại sao nó thuận tiện để có thể hiểu được các số hex. ;-)


Tôi nghĩ bạn có nghĩa là "octet", không phải "bát phân". Một chữ số bát phân là ba bit. Việc sử dụng hằng số bát phân cho các ký tự không phải ASCII là một sự nắm giữ từ những ngày đầu của C, được phát triển trên PDP-11, sử dụng biểu diễn bát phân trong hầu hết các tài liệu (xem thẻ tham chiếu PDP-11 này ).
TMN

Tôi có thể Tiếng Anh không phải là tiếng mẹ đẻ của tôi. :-)
Denis de Bernardy

1

Tôi tốt nghiệp đại học 3 năm trước, và tôi nghĩ việc đọc và viết các số hex là rất quan trọng. Tôi gây rối với rất nhiều tệp XML lớn cho công việc (nghĩa lớn 100MB +). Đôi khi bạn sẽ nhận được tệp XML phàn nàn ký tự XML không hợp lệ, không thể hiển thị trong bất kỳ trình soạn thảo văn bản nào, vì vậy tôi phải sử dụng trình soạn thảo Hex và viết mã để xác định các ký tự không hợp lệ. Nhiệm vụ đó sẽ rất khó khăn nếu không biết số hex.


1

Nhiều năm trước tôi đã học được giá trị của hex khi làm việc trên các hệ thống 8 bit.

Sự rõ ràng của việc hiểu rằng một cái gì đó được đặt tại B000 hoặc E7FF là tuyệt vời.

Hôm qua tôi cần biết chính xác những ký tự ở cuối dòng văn bản. Biết được sự khác biệt giữa 0x0A và 0x0A 0x0D có thể thực sự quan trọng.


1

Có ai có một ví dụ tốt về nơi lập trình viên trung bình thực sự sẽ sử dụng một số bát phân không?

Octal những ngày này là khá hiếm, nhưng tôi sử dụng hex rất thường xuyên, và thường nghĩ về các vấn đề trong nhị phân.

Tôi lập trình chủ yếu bằng C và C ++, với một số Objective C và thực hiện nhiều công việc với đồ họa raster và vector trên Linux và Mac OS X. Trong các đấu trường đó, việc viết mã chạy hiệu quả và sử dụng lưu trữ tốt là điều tối quan trọng. Bạn cũng phải hiểu cách các máy móc thể hiện bên trong những gì bạn đang làm việc. Cách thuận tiện nhất để xem xét đó là trong hex. Chẳng hạn, một pixel màu 24 bit tiêu chuẩn được biểu thị bằng ba byte và biết rằng 0x000000 là màu đen, 0x00FF00 là màu đỏ và 0x008000 là màu hồng thực sự rất hữu ích!

Tôi cũng làm việc rất nhiều với các tiêu chuẩn quốc tế cho các định dạng tập tin. Một cái tôi đã làm việc gần đây là MXF, được sử dụng để lưu trữ video để phát sóng, DVD, v.v ... Đó là định dạng nhị phân, và một lần nữa, nó dễ dàng xử lý nhất bằng cách sử dụng hex hoặc đôi khi là nhị phân. Khi bạn gỡ lỗi tại sao một số video dựa trên MXF không phát ngay trên hệ thống của bạn, thật tiện dụng khi có thể lướt qua một số trường 32 bit và nhận ra bit để làm trống màn hình vô tình được đặt - và bạn có thể làm được trong hex, nhưng nó không thể thực hiện được trong cơ sở 10.

Nếu bạn sẽ dành sự nghiệp của mình để viết Perl để xoa bóp các chuỗi văn bản, thì không, có lẽ bạn không cần phải làm quen với hex, bát phân hoặc nhị phân. Nhưng thời điểm bạn bắt đầu xử lý các loại việc tôi làm, hex và nhị phân ít nhất là rất cần thiết.


0

Bạn nên biết thập lục phân nếu bạn muốn trở thành một lập trình viên. Sẽ thật khó xử khi bạn phải thừa nhận tại nơi làm việc vào ngày hiếm hoi mà bạn cần biết rằng bạn không hiểu điều đó.

Không có nghĩa là bạn phải có thể thêm các số thập lục phân trong đầu. Nó bắt đầu làm phiền bạn về các quy tắc để bổ sung thường xuyên nếu bạn vẫn làm. :)


0

Những gì nhị phân, hex và bát phân có điểm chung không phải là chúng không phải là cơ sở 10, mà chúng đều là sức mạnh của hai. Vì Máy tính vốn là nhị phân, điều này mang lại cho mỗi ứng dụng một số ứng dụng trong đó chúng là cách thích hợp hoặc hiệu quả nhất để hiển thị và xử lý dữ liệu.

Điều này từng rất quan trọng, trở lại khi tất cả các chương trình ở mức độ thấp. Trong lập trình cấp cao ngày nay, các hệ thống Số 2 mạnh mẽ ít quan trọng hơn nhiều. Có một giới thiệu kỹ lưỡng về họ trong mỗi khóa học lập trình có thể là một di tích của thời xa xưa.

Nhưng các hệ thống số này vẫn có công dụng của chúng, ngay cả khi bạn làm việc trong các ngôn ngữ cấp cao. Màu, ví dụ, vẫn được lưu trữ trong 24 bit, 8 bit cho mỗi màu chính. Và vì thập lục phân là cách tốt nhất để biểu diễn một byte theo cách có thể đọc được của con người, nó thậm chí là một phần của CSS, được cho là có thể sử dụng được bởi những người chưa bao giờ giới thiệu về lập trình.

Bạn không thể hiểu máy tính mà không hiểu nhị phân. Giới thiệu về nhị phân là một phần cần thiết của mỗi giới thiệu kỹ lưỡng về lập trình. Bạn có thể không cần thực hiện nhiều chuyển đổi giữa các hệ thống số trong công việc hàng ngày, nhưng thực hiện các bài tập như thế là cách duy nhất để thực sự làm quen với các hệ thống số này *. Biết nhiều hơn một hệ thống không phải là số 10 là cách duy nhất để hiểu đúng, dữ liệu đó có thể được trình bày theo nhiều cách, tất cả đều hợp lệ.

  • Như John von Neumann đã nói: "[..] chúng tôi không hiểu mọi thứ, chúng tôi đã quen với chúng."

0

Tôi nghĩ việc chuyển đổi như vậy từ cơ sở này sang cơ sở khác không quan trọng lắm đối với lập trình. Trong lập trình cấp cao, bạn không cần chuyển đổi (và có thể bạn đã từng làm như vậy, chức năng lib và máy tính có sẵn.) Khi bạn đi sâu vào lập trình cấp thấp hơn, bạn không còn tham gia khóa học giới thiệu nữa.

Tôi nghĩ rằng hai vấn đề (liên quan) rất quan trọng để bao quát trong một khóa học cơ bản.

  1. Về mã hóa. Nó không phải là về chuyển đổi toán học mà là sử dụng số (bất kỳ loại số nào) để lưu trữ thông tin (bất kỳ loại thông tin nào). Bạn cũng có thể minh họa điều này bằng mã morse hoặc vẽ bằng số, nếu bạn muốn. Nhưng vì các máy tính thay vì sử dụng nhị phân và nhị phân thường được hiển thị dưới dạng hex, mọi thứ thường được minh họa bằng các ví dụ hexy. (Và, trong khi họ đang ở đó, họ có thể giải thích một chút về kết thúc dòng, đã được đề cập trong chủ đề này. Tôi chỉ khuyên bạn nên nhận ra các hình dạng và hình thức khác nhau có thể có, một vài trong số đó là 0x0D, 0x0A , CRLF, '\ n' và '\ r')

  2. Vấn đề tràn. Một lần nữa, không cần phải minh họa điều này với hex. Bạn có thể sử dụng ví dụ y2k (không liên quan gì đến hex) Ở đây tôi cũng khuyên bạn nên nhận ra các chỉ số có khả năng nhất khác nhau (255, 32767, 65535, 2M14) Tại sao chúng là các chỉ số được liên kết trực tiếp với bản chất tạm thời của bộ nhớ trong, nhưng việc chuyển đổi không phải là phần quan trọng.

Tôi không đồng ý rằng bạn cần biết về bitflags (vì trong một khóa học giới thiệu về lập trình, các hằng số được đặt tên có tính hướng dẫn và hữu ích hơn nhiều.)


0

Nếu bạn đi vào lập trình nhúng cấp thấp, bạn sẽ sử dụng hệ thập lục phân. Nó được sử dụng cho những thứ như chỉ định các mẫu bit trong các thanh ghi phần cứng và các giá trị byte trong các bãi chứa bộ nhớ. Bạn cũng sẽ học cách sử dụng mọi toán tử bit-bit trong bất kỳ ngôn ngữ lập trình nào mà bạn sử dụng.

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.