2012-06-06 42 views
49

Đôi khi tôi thấy hằng số Integer được xác định trong hệ thập lục phân, thay vì số thập phân. Đây là một phần nhỏ tôi lấy từ một lớp GL10:Tại sao sử dụng hằng số thập lục phân?

public static final int GL_STACK_UNDERFLOW = 0x0504; 
public static final int GL_OUT_OF_MEMORY = 0x0505; 
public static final int GL_EXP = 0x0800; 
public static final int GL_EXP2 = 0x0801; 
public static final int GL_FOG_DENSITY = 0x0B62; 
public static final int GL_FOG_START = 0x0B63; 
public static final int GL_FOG_END = 0x0B64; 
public static final int GL_FOG_MODE = 0x0B65; 

Đó rõ ràng là đơn giản để xác định 2914 thay vì 0x0B62, như vậy là có thể một số đạt được hiệu suất? Tôi acutallly không nghĩ như vậy, kể từ đó nó nên được công việc của trình biên dịch để thay đổi nó. Ví dụ:

+7

Không có gì hiệu quả về nó - đôi khi nó là quy ước mã hóa, đôi khi nó là một bitmask, đôi khi nó là một biến cờ, đôi khi nó chỉ là một số – Petesh

+3

Và đôi khi nó chỉ dành cho người mới bắt đầu khó hiểu;) – mallaudin

+0

@mallaudin Người mới bắt đầu nên tìm hiểu những điều cơ bản. Không phải OpenGl. –

Trả lời

56

Nó có khả năng làm sạch tổ chức và hình ảnh. Base 16 có mối quan hệ đơn giản hơn nhiều so với cơ sở nhị phân so với cơ số 10, bởi vì trong cơ sở 16 mỗi chữ số tương ứng với chính xác bốn bit.

Lưu ý cách thức ở trên, các hằng số được nhóm lại với nhiều chữ số chung.Nếu chúng được biểu diễn bằng số thập phân, các bit chung sẽ ít rõ ràng hơn. Thay vào đó, nếu chúng có chữ số thập phân, các mẫu bit sẽ không có cùng mức độ giống nhau.

Ngoài ra, trong nhiều trường hợp, mong muốn có thể bitwise-OR kết hợp với nhau để tạo kết hợp cờ. Nếu giá trị của mỗi hằng số bị ràng buộc để chỉ có một tập hợp con của các bit khác không, thì điều này có thể được thực hiện theo cách có thể được phân tách lại. Sử dụng hằng số hex làm cho nó rõ ràng bit nào khác 0 trong mỗi giá trị.

Có hai khả năng hợp lý khác: bát phân, hoặc cơ sở 8 đơn giản mã hóa 3 bit trên mỗi chữ số. Và sau đó có số thập phân được mã hóa nhị phân, trong đó mỗi chữ số yêu cầu bốn bit, nhưng các giá trị chữ số trên 9 bị cấm - điều đó sẽ bất lợi vì nó không thể đại diện cho tất cả các khả năng nhị phân có thể.

+1

Bạn rất đúng về việc kết hợp các hằng số với bitwise-OR ... hoàn toàn quên về điều đó ... –

9

Dễ đọc khi áp dụng hệ thập lục phân masks.

2

Không đạt được hiệu suất.

Tuy nhiên, nếu các hằng số này tương ứng với các bit nhất định bên dưới, hầu hết các lập trình viên thích Hex (hoặc thậm chí nhị phân) để làm cho rõ ràng và dễ đọc hơn.

Ví dụ, người ta có thể dễ dàng thấy rằng GL_EXP2 có 2 bit trên, bit 1 bit và 0x0800 (là 2048 thập phân). Giá trị thập phân 2049 sẽ ít rõ ràng hơn.

+0

Không chỉ vậy, nhưng một số ngôn ngữ lập trình không có một kiểu dữ liệu nhị phân, và như bạn đã nói, chuyển đổi từ nhị phân sang hex và ngược lại dễ hơn rất nhiều so với số thập phân. 0001 == 1 0010 == 2 0011 == 3 ... 1001 == 9 1010 == A ... 1110 == E 1111 == F. Có mối quan hệ chữ cái 4 đến 1 chữ cái. Vì vậy, A3 = 10100011 –

8

Sẽ không đạt được hiệu suất giữa số thập phân và số thập lục phân, vì mã sẽ được biên dịch để di chuyển hằng số byte đại diện cho số.

Máy tính không làm số thập phân, chúng thực hiện (nhị phân). Bản đồ hệ thập lục phân để nhị phân rất sạch sẽ, nhưng nó đòi hỏi một chút công việc để chuyển đổi một số thập phân thành nhị phân.

Một nơi mà hệ thập lục phân tỏa sáng là khi bạn có một số mục có liên quan, trong đó nhiều mục tương tự nhau, nhưng hơi khác nhau.

// These error flags tend to indicate that error flags probably 
// all start with 0x05.. 
public static final int GL_STACK_UNDERFLOW = 0x0504; 
public static final int GL_OUT_OF_MEMORY = 0x0505; 

// These EXP flags tend to indicate that EXP flags probably 
// all start with 0x08.. 
public static final int GL_EXP = 0x0800; 
public static final int GL_EXP2 = 0x0801; 

// These FOG flags tend to indicate that FOG flags probably 
// all start with 0x0B.., or maybe 0x0B^. 
public static final int GL_FOG_DENSITY = 0x0B62; 
public static final int GL_FOG_START = 0x0B63; 
public static final int GL_FOG_END = 0x0B64; 
public static final int GL_FOG_MODE = 0x0B65; 

Với số thập phân, bạn sẽ khó nhấn "thông báo" các vùng liên tục của các bit trên một số lượng lớn các mục khác nhau nhưng có liên quan.

+0

Tại sao bạn nói "họ [máy tính] làm (tốt nhất) nhị phân"? Bạn đã bao giờ làm việc với một máy tính đã làm bất cứ điều gì khác hơn là nhị phân? Tôi đã bị ấn tượng với bất kỳ máy tính nào làm việc với các căn cứ khác, như trinary, hầu như chỉ là giả thiết với một vài máy tính được xây dựng như là bằng chứng-khái niệm? – ArtOfWarfare

+0

(tốt nhất) có nghĩa là chỉ báo rằng tất cả các hoạt động cơ bản trong các máy tính thông thường là nhị phân trong tự nhiên và không được thiết kế nội tại trên các cường độ cao hơn (trinary, octal, decimal, hexadecimal, vv). ba trạng thái logic, nhưng không phải là một máy tính đầy đủ được xây dựng dựa trên ba trạng thái logic. Một số mạch kết thúc để chuyển mạch trong các hệ thống điều khiển có ba trạng thái, "mở/đóng/thất bại" trong trường hợp không thành công chỉ ra rằng mạch không thể xác nhận nó được mở hoặc đóng đúng cách. Đương nhiên, chúng tôi chỉ dịch thành hai bit nhị phân và gán trạng thái "lỗi" bổ sung. –

3

Hệ thập lục phân là định dạng có thể đọc gần nhất với định dạng nhị phân. Điều này giúp đơn giản hoá một số thao tác bit ví dụ:

5

Khi nói đến số lớn, biểu diễn chúng trong hệ thập lục phân làm cho chúng dễ đọc hơn, vì chúng nhỏ gọn hơn.

Ngoài ra, đôi khi nó có ý nghĩa đối với các chuyển đổi thành nhị phân: một số thập lục phân có thể rất dễ chuyển đổi thành nhị phân. Một số lập trình viên thích làm điều này, nó giúp khi thực hiện các thao tác bit trên các con số.

Để đạt được hiệu suất: không, không có.

3

0xB62 bằng 2914 :-)

Đối với các nhà phát triển sẽ dễ dàng hơn nhiều để tinh thần hình dung ra các mẫu bit của một hằng số khi nó được trình bày trong hệ thập lục phân so với khi nó được trình bày như một căn cứ 10 số nguyên.

Thực tế này làm cho bản trình bày trong thập lục phân phù hợp hơn cho các hằng số được sử dụng trong API nơi bit và vị trí của chúng (được sử dụng như cờ riêng lẻ chẳng hạn) có liên quan.

22

"Đó rõ ràng là đơn giản để xác định năm 2914 thay vì 0x0B62"

Tôi không biết về điều đó trường hợp cụ thể, nhưng khá thường xuyên đó là không đúng sự thật.

Trong số hai câu hỏi:

  • A) giá trị chút 2914 là gì?
  • B) Giá trị bit của 0x0B62 là bao nhiêu?

B sẽ được trả lời chính xác hơn nhanh hơn bởi nhiều người phát triển. (Điều này đi cho câu hỏi tương tự cũng)


0x0B62 (nó có chiều dài 4 hex chữ số nên nó reprensents một số 16-bit)

  • các bit 0 = 0000
  • các bit B = 1011
  • các bit của 6 = 0110
  • các bit của 2 = 0010

->

(Tôi dám bạn làm tương tự với 2914.)


Đó là một trong những lý do cho việc sử dụng các giá trị hex, khác là nguồn gốc của giá trị sức mạnh sử dụng hex (tiêu chuẩn của một đặc điểm kỹ thuật chẳng hạn).

Đôi khi tôi chỉ thấy nó ngớ ngẩn, như trong:

public static final int NUMBER_OF_TIMES_TO_ASK_FOR_CONFIRMATION = ...; 

sẽ hầu như luôn ngớ ngẩn để viết trong hex, tôi chắc chắn rằng có một số trường hợp nó sẽ không.

+0

Lý do về chuyển đổi khá yếu: Bắt đầu - Chương trình - Chuẩn - Máy tính - nhập số thập phân - chuyển sang chế độ nhị phân - lợi nhuận !Trong thực tế, tôi có Calculator trên thanh tác vụ, vì vậy hãy bỏ qua các bước 1-3. – Kromster

+5

Tôi xin lỗi vì quan điểm của tôi không đủ rõ ràng. Các "tính toán" ở trên được thực hiện gần như ngay lập tức bởi tôi và những người khác - chúng tôi thường được thực hiện trước khi bạn dán giá trị vào máy tính của bạn. Khá thường xuyên tôi thấy mình chỉ quan tâm đến một chút (một lá cờ), vì vậy tôi không quét toàn bộ chuỗi chỉ tìm thấy các byte/chữ số bao gồm các bit trong câu hỏi. – esej

+4

@esej: Để làm cho mọi việc trở nên rõ ràng hơn, so sánh độ khó khi tìm mẫu bit 0x60000000 so với 1610612736. Nếu cả hai số có nhiều chữ số khác không phải F, sự khác biệt về độ khó không rõ ràng, nhưng nhiều giá trị hex thực tế bao gồm chủ yếu là zero và F's. – supercat

6

Bạn có muốn viết 0xFFFFFFFF hoặc 4294967295 không?

Biểu tượng đầu tiên rõ ràng hơn đại diện cho loại dữ liệu 32 bit với tất cả dữ liệu. Tất nhiên, nhiều lập trình viên dày dặn sẽ nhận ra mô hình thứ hai, và có một sự nghi ngờ lén lút về ý nghĩa thực sự của nó. Tuy nhiên, ngay cả trong trường hợp đó, nó dễ bị lỗi đánh máy hơn, v.v.

+0

0x rất phù hợp với các giá trị RGBA, các trường hợp khác là hằng số cũ tốt * GL_SOMETHING * là tốt nhất. – Kromster

1

Đôi khi nó dễ dàng hơn bằng cách sử dụng các thuật toán liên quan đến bit. Lần khác, nó đề cập đến so sánh bit, như tuyên bố của tôi trong một nhận xét, 4 bit (số nhị phân) chuyển đổi thành 1 chữ cái hex, vì vậy, A3 = 10100011.

Lần khác, hoặc là vui hoặc phá vỡ sự đơn điệu, mặc dù những người không quen thuộc với hex có thể nghĩ rằng bạn đang làm những việc với con trỏ

int data = 0xF00D; 
if (val != 0xC0FFEE) 
{ 
    data = 0xDECAF; 
} 

Tôi đôi khi sử dụng nó để kiểm tra giới hạn của những thứ như ints. Ví dụ, bạn có thể sử dụng 0x7FFFFFFF (0x80000000 hoạt động trong nhiều trường hợp nhưng 0x7F ... là an toàn hơn) để có được giới hạn int tối đa. Nó rất tiện lợi cho việc thiết lập một hằng số lỗi rất cao nếu bạn không có một ngôn ngữ có thứ gì đó giống như MAX_INT. Kỹ thuật này cũng có quy mô, vì đối với 64-bit, bạn có thể sử dụng 0x7FFFFFFFFFFFFFFF. Bạn có thể nhận thấy rằng Android sử dụng 0x7_ __ để xem bảng R.id.

Tôi cá là họ đang làm điều đó vì mục đích rõ ràng. Bạn có thể dễ dàng sử dụng các số nguyên, nhưng nếu bạn đã quen thuộc với hex, nó không phải là xấu. Có vẻ như họ đang đặt x giá trị cho một số chức năng nhất định. Trong thập phân, bạn sẽ làm một cái gì đó như 0-99 là lỗi, 100-199 cho cái gì khác, và vv. Làm thế nào họ đang làm nó được thu nhỏ khác nhau.

Performance-khôn ngoan, bạn đạt được gì trong thời gian chạy từ trình biên dịch (thậm chí rất nhiều nhà lắp ráp) chuyển đổi bất cứ định dạng nhị phân cuối cùng, cho dù số thập phân, bát phân, thập lục phân, float, double, vv

3

Ahh nhưng 0xDECAFF là cả hai nguyên tố (1460959), và một màu tím vui vẻ (trong RGB).

Đối với màu Hex thuận tiện hơn.

FF FF FF là màu trắng 00 00 FF là màu xanh FF 00 00 là màu đỏ 00 FF 00 là màu xanh lá cây Thật dễ dàng để nhìn thấy các mối quan hệ màu như số (mặc dù gamma và độ trung thực của mắt con người có xu hướng để ném

Các vấn đề liên quan