Octal là dễ dàng hơn để viết ra một cách nhanh chóng, nhưng thập lục phân có các thuộc tính tốt đẹp của phá vỡ dễ dàng vào byte (trong đó có cặp chữ số thập lục phân). Một số viện trợ để ghi nhớ sự tương ứng của hệ thập lục phân (thường được gọi là 'hex') chữ số và chữ số thập phân đối tác của họ: hex 0-9 cũng giống như chữ số thập phân 0-9 A là người đầu tiên qua 9 và dễ nhớ là 10 F là người cuối cùng và do đó dễ nhớ như 15 C là số thập phân 12 (chỉ có một mà bạn sắp xếp của phải ghi nhớ) Tất cả còn lại là gần với A, C, hoặc F (B chỉ là A + 1, D là C + 1, E là F-1) Nếu ai đó nhắc đến các "bit thứ ba" của một số, nó tốt nhất để tìm hiểu xem họ có nghĩa là bit thứ ba từ bên trái hay bên cánh phải và liệu họ bắt đầu đếm từ 0 hoặc 1. Một hiểu lầm có thể dẫn đến các vấn đề thực laster trên (tức là đảo ngược chuỗi các bit!). Trang này, ví dụ, bắt đầu đếm với bit ngoài cùng bên phải là số 1. Trang này là một viên ngọc trong đó câu trả lời 5 đếm từ bên phải bắt đầu từ 1, trong khi câu trả lời 8 đếm từ bên phải bắt đầu từ 0. Hầu như tất cả các máy tính hiện đại sử dụng bên trái là bit là 'dấu hiệu' bit đó có nghĩa là một số nguyên âm nếu giá trị của nó là 1. Lưu ý rằng việc xác định vị trí của các bit dấu hiệu đòi hỏi kiến thức chính xác có bao nhiêu bit là trong một kiểu dữ liệu nhất định. Con số này có thể thay đổi theo thời gian (ví dụ, khi bạn biên dịch trên một máy tính khác nhau). Nói chung, sizeof () điều hành sẽ cho bạn biết số lượng byte (thường là 8 bit) đối số của nó chứa, ví dụ như, sizeof (int) hoặc sizeof (100) sẽ mang lại 4 trên một máy 32-bit. Đôi khi người ta có thể xác định một tập tin bao gồm hệ thống dựa trên có chứa các hằng số thích hợp nếu một chương trình phải phụ thuộc vào một từ nào đó (số nguyên) chiều dài. Hoạt động trên số nhị phân trong các chương trình Đôi khi nó là tiện dụng để làm việc với các bit được lưu trữ với số lượng hơn là chỉ đối xử với họ như là số nguyên. Ví dụ về các lần như vậy bao gồm các lựa chọn ghi nhớ (mỗi khe bit có thể là một 'yes' / 'no' chỉ số), theo dõi các tùy chọn lá cờ (cùng ý tưởng, thực sự, mỗi khe bit là 'yes' / 'no' chỉ số cho một sự hiện diện của lá cờ), hoặc lưu giữ theo dõi của một số các số nguyên nhỏ (ví dụ, cặp kế tiếp của khe bit có thể nhớ số từ 0..3). . Tất nhiên, nhiệm vụ đôi khi lập trình thực sự có chứa 'chuỗi bit' Trong C / C ++ và những người khác, chỉ định một số nhị phân là dễ dàng nếu bạn biết bát phân của mình hoặc đại diện thập lục phân: i = 0x9AD5A2AB; / * Thập lục phân: 0x * / hoặc i = 023265321253; / * Bát phân: bắt đầu bằng 0 * / Thông thường, một đôi duy nhất-bit có giá trị số nguyên được kết hợp để tạo ra một số nguyên quan tâm. Người ta có thể nghĩ rằng những tuyên bố dưới đây sẽ làm điều đó: i = 0x10000 + 0x100; và nó sẽ - cho đến khi bit dấu hiệu bước vào bức tranh hoặc các bit cùng được kết hợp hai lần: i = 0x100 + 0x100; Trong trường hợp đó, một 'mang' xảy ra (0x100 + 0x100 = 0x200 mà có lẽ không phải là kết quả bạn muốn) và sau đó tôi có chứa 0x200 0x100 thay vì như lẽ mong muốn. Các 'hoặc' hoạt động - ký hiệu là '|' trong C / C ++ và những người khác - không đúng. Nó kết hợp các bit tương ứng trong hai toán hạng của nó bằng cách sử dụng bốn nguyên tắc: 0 | 0 -> 0 0 | 1 -> 1 1 | 0 -> 1 1 | 1 -> 1 Sự '|' hoạt động được gọi là 'bitwise hoặc' trong C để không bị nhầm lẫn với nó là anh em họ '||' gọi là 'logic hoặc' hoặc 'orif'. Các '||' nhà điều hành đánh giá các giá trị số học của phụ tử bên trái của nó, và nếu giá trị đó là sai (chính xác là 0), nó đánh giá bên toán hạng phải. Các 'orif' hành là khác nhau: nếu một trong hai toán hạng là khác không, sau đó '||' để đánh giá đúng (chính xác là 1 trong C). Đó là "1 | 1 = 1" mà phân biệt các '|' hành từ '+'. Đôi khi các nhà khai thác như thế này được hiển thị như là một "chân lý bảng ': toán hạng phải điều hành | | 0 1 --- + ------ trái 0 | 0 1 Thật dễ dàng để thấy rằng các hoạt động 'bitwise hoặc' là một cách để thiết lập các bit bên trong một số nguyên. Kết quả A '1' với một trong hai hoặc cả hai bit đầu vào là '1'. Cách dễ dàng để truy vấn bit được sử dụng "logic và '(còn được gọi là 'bitwise và') điều hành được ký hiệu là '&' và có này bảng sự thật: & | 0 1 --- + ------ 0 | 0 0 1 | 0 1 Đừng nhầm lẫn giữa '&' điều hành duy nhất với đối tác của mình có tên là 'andif' với hai ký hiệu và ('&&') . Các 'andif' nhà điều hành sẽ đánh giá mặt trái của nó và mang lại 0 nếu phía bên trái là sai, mà không đánh giá bên toán hạng phải. Chỉ khi bên trái là đúng sự thật sẽ ở bên phải được đánh giá, và kết quả của các nhà điều hành là hợp lý 'và' các giá trị chân lý của họ (chỉ như trên) và được đánh giá là một trong hai số nguyên 0 hoặc 1 số nguyên (vs. '&' mà sẽ mang lại 4 khi đánh giá nhị phân 100.100 & 000.111). kết quả A '1' chỉ khi cả hai bit đầu vào là '1'. Vì vậy, nếu một chương trình muốn biết nếu bit 0x100 là '1' trong một số nguyên, nếu tuyên bố là đơn giản: nếu (a & 0x100) {printf ("yes, 0x100 là onn"); } C / C ++ (và những người khác) chứa các toán bổ sung, bao gồm cả 'độc quyền hoặc' (ký hiệu là '^') với bảng sự thật này: ^ | 0 1 --- + ------ 0 | 0 1 1 | 1 0 Những 'độc quyền hoặc' điều hành đôi khi được gọi là "xor", để dễ dàng đánh máy. Xor mang lại một '1' hoặc là chính xác một trong những yếu tố đầu vào của nó là một: hoặc là một hay khác, nhưng không phải cả hai. Nhà điều hành này là rất tiện dụng cho 'toggling' (flipping) bit, thay đổi họ từ '1' để '0' hoặc ngược lại. Hãy xem xét tuyên bố này: a = a ^ 0x100; / * Giống như a ^ = 0x100; * / Các bit 0x100 sẽ được thay đổi từ 0-> 1 hoặc 1-> 0, tùy theo giá trị hiện tại của nó. Tắt một chút yêu cầu hai nhà khai thác. Các mới là toán tử đơn mà Toggles mỗi bit trong một từ, tạo ra những gì được gọi là "bổ sung bitwise 'hay chỉ là' bổ sung 'của một từ. Đôi khi điều này được gọi là "Đảo ngược bit 'hay chỉ là' đảo ngược 'và được ký hiệu bằng dấu ngã:' ~ '. Dưới đây là một ví dụ nhanh: char a, b; / * Tám bit, không phải 32 hay 64 * / a = 0x4A; / * Nhị phân 0100.1010 * / b = ~ a; / * Lật từng bit: 1011.0101 * / printf ("b là 0x% Xn", b); trong đó sản lượng: b là 0xB5 Vì vậy, nếu chúng ta có một chút đơn bật (ví dụ, 0x100) sau đó ~ 0x100 có tất cả, nhưng một bit bật: 0xFFFFFEFF (lưu ý các 'E' trong giới thứ ba 'chữ số' từ bên phải) (ví dụ này cho thấy một giá trị 32-bit; một giá trị 64-bit sẽ có nhiều hơn F về phía trước). Hai nhà khai thác kết hợp để tạo ra một chương trình cho tắt bit: a = a & (~ 0x100); / * Tắt bit 0x100 * / / * giống như một & = ~ 0x100; vì tất cả nhưng một chút trong ~ 0x100 là, tất cả các bit trừ các bit 0x100 xuất hiện trong kết quả. Kể từ khi bit 0x100 'tắt' trong ~ 0x100, bit đó là đảm bảo được '0' trong kết quả. . Hoạt động này được phổ gọi là 'mặt nạ' như trong 'mặt nạ bit 0x100' Tóm tắt Tóm lại, các nhà khai thác enable thiết lập, thanh toán bù trừ, chuyển đổi qua lại, và thử nghiệm bất kỳ bit hoặc sự kết hợp của các bit trong một số nguyên: a | = 0x20; / * Bật bit 0x20 * / a & = ~ 0x20; / * Tắt bit 0x20 * / a ^ = 0x20; / * Toggle bit 0x20 * / if (a & 0x20) { / * sau đó các bit 0x20 là trên * / } #### Chuyển bit di chuyển sang trái hoặc phải được gọi là 'shift'ing. Hãy xem xét một số nhị phân lăm-bit như 00110. Nếu con số đó được chuyển một chút bên trái, nó trở thành: 01100. Mặt khác, nếu 00.110 là chuyển một chút về bên phải, nó sẽ trở thành 000011. Về mặt toán học nghiêng người dùng sẽ nhận ra rằng chuyển bên trái một chút là giống như nhân với 2 khi chuyển sang bên phải một chút thường giống như một số nguyên chia cho 2 (tức là, một trong những loại bỏ bất kỳ phần còn lại). Tại sao thường? Chuyển -1 quyền bởi một mang lại một kết quả bất thường (tức là ,, 0xFFFF.FFFF >> 1 == 0xFFFF.FFFF, không thay đổi ở tất cả). Nói chung, người ta có thể chỉ định một sự thay đổi bởi nhiều hơn một chút: Chuyển 000001 bên trái bởi ba bit mang 001000. Các nhà khai thác dịch chuyển là: a> n / * chuyển quyền n bit Một thường chuyển số nguyên (thay vì số dấu chấm động), mặc dù không có gì ngăn cản chuyển số dấu chấm động trong một số ngôn ngữ. Các kết quả nói chung là rất khó để giải thích như là một số điểm nổi, tất nhiên. Khi chuyển sang bên trái, 0 của được chèn vào cuối thấp hơn. Khi chuyển sang bên phải, các bit bậc cao được nhân đôi và chèn vào cho các bit mới cần thiết (do đó giữ được dấu của số). Điều này có nghĩa là (-1) >> 1 suất -1 thay vì 0! Một loại thay đổi, không có sẵn tự nhiên trong hầu hết các ngôn ngữ lập trình là thay đổi 'tròn', nơi mà các bit chuyển ra khỏi một đầu được chèn vào cuối khác thay vì mặc định 0. sử dụng hiện đại của hoạt động này là rất hiếm nhưng có thể thỉnh thoảng xuất hiện. Một số máy (ví dụ, các kiến trúc x86) có hướng dẫn lắp ráp ngôn ngữ cho điều này, nhưng C thận trọng hoặc lập trình Java sẽ dành một vài chu kỳ máy hơn (một phần tỷ giây) để thực hiện cả một sự thay đổi và sau đó một chút-chiết-shift -Hoặc kết hợp để di chuyển các bit bản thân. Một lưu ý về tối ưu hóa: một số lập trình tối ưu hóa nhiệt tâm muốn thay đổi một / 4 để '(a >> 2) để tiết kiệm thời gian ("kể từ khi nhân lên có thể được làm chậm"). Biên dịch hiện đại biết tất cả về điều này và thực hiện thay thế như tự động, do đó để lại các lập trình viên tốt hơn để viết / 4 khi đó là những gì có nghĩa là. Rất chi tiết Bit Manipulation Bỏ qua phần này nếu đây là lần đầu tiên của bạn đối phó với bit. Đọc nó lúc giải trí của bạn trong tương lai sau khi bạn đã viết một số mã thao tác bit. Thực sự. Nó chỉ ra rằng máy đường 2 của bổ sung đại diện cho số nguyên và cách thức họ thực hiện phép trừ (các tiêu chuẩn trên hầu như tất cả các máy móc hiện đại) sản lượng một số khả năng rất thú vị cho các thao tác bit. Hai của máy bổ sung đại diện cho số nguyên dương là biểu diễn nhị phân của số nguyên với một số 0 vào bit dấu. Một số nguyên âm được biểu diễn như là phần bù của các số nguyên dương (bao gồm cả chuyển về bit dấu) cộng với 1. Như vậy, giá trị tuyệt đối của số nguyên biểu diễn tiêu cực nhất là một nhiều hơn số nguyên biểu diễn tích cực nhất. Như vậy: x + x 8-bit nhị phân -x trong 8-bit nhị phân 0 0000 0000 0000 0000 1 000
đang được dịch, vui lòng đợi..
