Máy tính bitwise

Thực hiện các phép toán bitwise trên các số nguyên và xem kết quả ở dạng thập phân, thập lục phân và nhị phân.

Nhập giá trị và nhấp Tính.

Cách thức hoạt động

  1. Nhập hai số: nhập các giá trị để thực hiện phép toán, ở dạng thập phân, nhị phân (tiền tố 0b) hoặc thập lục phân (tiền tố 0x).
  2. Chọn phép toán: chọn AND, OR, XOR, NOT, dịch trái (<<) hoặc dịch phải (>>).
  3. Xem kết quả: đầu ra hiển thị kết quả ở dạng thập phân, nhị phân và thập lục phân cùng một lúc, với hình ảnh hóa bitwise.

Tại sao sử dụng máy tính bitwise?

Các phép toán bitwise là cơ bản trong lập trình hệ thống, mật mã học, phát triển trò chơi, đồ họa, mạng và hệ thống nhúng. Hiểu cách AND, OR, XOR và các phép dịch xử lý các bit riêng lẻ là rất quan trọng để bật/tắt cờ, đóng gói dữ liệu và triển khai các thuật toán hiệu quả. Máy tính này hiển thị phép toán ở mức bit để xem chính xác cách mỗi bit bị ảnh hưởng.

Tính năng

Câu hỏi thường gặp

XOR dùng để làm gì trong lập trình?

XOR (^) được sử dụng để đảo bit, mã hóa/làm rối đơn giản, hoán đổi các biến mà không cần biến tạm, kiểm tra chẵn lẻ và trộn các hash. Nó trả về 1 khi các bit khác nhau và 0 khi chúng giống nhau.

Sự khác biệt giữa << và >> là gì?

Dịch trái (<<) di chuyển tất cả các bit sang trái, tương đương với phép nhân với lũy thừa của 2. Dịch phải (>>) di chuyển các bit sang phải, tương đương với phép chia cho lũy thừa của 2. Dịch phải số học giữ nguyên bit dấu; dịch phải logic điền vào bằng số 0.

Cách kích hoạt hoặc vô hiệu hóa một bit cụ thể?

Để kích hoạt bit n: value |= (1 << n). Để vô hiệu hóa bit n: value &= ~(1 << n). Để đảo bit n: value ^= (1 << n). Để kiểm tra nếu bit n được kích hoạt: (value & (1 << n)) !== 0.

Từ đại số Boolean đến silicon: làm thế nào các phép toán bit trở thành phổ quát

Các phép toán bit mà mọi CPU hiện đại triển khai đến từ hai bài báo nền tảng được xuất bản cách nhau hơn 80 năm. Vào năm 1854, George Boole đã xuất bản «An Investigation of the Laws of Thought», định nghĩa đại số của logic hai giá trị, AND, OR, NOT và các đẳng thức của chúng. Đó là một công trình triết học, không phải kỹ thuật. Sau đó vào năm 1937, một sinh viên thạc sĩ 21 tuổi của MIT tên là Claude Shannon đã viết luận văn thạc sĩ «A Symbolic Analysis of Relay and Switching Circuits», chứng minh rằng đại số Boolean có thể mô tả các mạch rơ-le điện và do đó bất kỳ phép tính logic nào cũng có thể được triển khai vật lý. Luận văn này được trích dẫn rộng rãi là luận văn thạc sĩ quan trọng nhất của thế kỷ 20 và là nền tảng của tất cả điện tử kỹ thuật số. Bù hai, biểu diễn nhị phân cho các số âm mà mọi CPU sử dụng, đã được cấp bằng sáng chế vào năm 1962 bởi Burroughs Corporation nhưng đã được sử dụng trong IBM 704 (1954) và các máy thời kỳ đầu khác. IEEE 754 đã chuẩn hóa biểu diễn dấu phẩy động vào năm 1985, cố định bố cục bit mà mọi Number JavaScript vẫn sử dụng, 1 bit dấu, 11 số mũ, 52 mantissa cho binary64. Ngày nay, các toán tử ngôn ngữ C & | ^ ~ << >> ánh xạ gần như trực tiếp đến các lệnh CPU đơn lẻ, đó là lý do tại sao mã bit có thể nhanh hơn đáng kể so với các phép tương đương số học.

Sáu toán tử, chúng làm gì ở cấp độ bit

Nơi bitwise thực sự kiếm tiền lương

Lỗi cắn

Tại sao bù hai, và nó có nghĩa là gì ở cấp độ bit

Mọi CPU hiện đại đại diện cho các số nguyên âm bằng cách sử dụng bù hai. Trong một byte có dấu 8-bit, các giá trị 0 đến 127 được mã hóa dưới dạng nhị phân 0000_0000 đến 0111_1111. Sau đó −1 được mã hóa dưới dạng 1111_1111, −2 dưới dạng 1111_1110, xuống đến −128 dưới dạng 1000_0000. Lý do: với mã hóa này, phép cộng hoạt động theo cùng một cách cho dù đầu vào là có dấu hay không dấu, CPU không cần các lệnh add-có-dấu và add-không-dấu riêng biệt. Tính bất đối xứng là phạm vi âm lớn hơn phạm vi dương một (trong 8 bit, −128 đến +127), đó là lý do tại sao Math.abs(INT_MIN) tràn trong mọi ngôn ngữ có số nguyên chiều rộng cố định. Các mã hóa cũ hơn dấu-độ lớn (một bit cho dấu, phần còn lại cho độ lớn) và bù một tồn tại trong những năm 1950-60 nhưng thua bù hai vì chúng có hai cách biểu diễn số không và yêu cầu phần cứng trường hợp đặc biệt cho phép phủ định.

Các câu hỏi thường gặp khác

Tại sao ~5 bằng -6 thay vì 250?

Bởi vì trong bù hai (mã hóa mà mọi CPU hiện đại sử dụng), lật mọi bit của một số dương cho bạn -n - 1. Vì vậy ~5 === -6~0 === -1. Trong ngữ cảnh không dấu 8-bit, mẫu bit tương tự ~5 (nhị phân 1111_1010) sẽ đại diện cho 250. JavaScript coi kết quả là có dấu 32-bit, vì vậy bạn thấy -6. Để có được diễn giải không dấu: (~5) >>> 0 trong 32-bit, cho 4294967290, hoặc mask xuống 8 bit với ~5 & 0xFF cho 250.

XOR có thực sự là một mã hóa không?

XOR là khối xây dựng của mọi mật mã đối xứng hiện đại, nhưng XOR một mình không phải là mã hóa an toàn. Một sổ tay một lần, XOR với một khóa thực sự ngẫu nhiên dài bằng thông điệp, được sử dụng đúng một lần, là không thể phá vỡ về mặt thông tin lý thuyết (Shannon, 1949). Sử dụng lại khóa, hoặc sử dụng khóa ngắn hơn thông điệp, và phân tích tần số phá vỡ nó một cách tầm thường. Các mật mã thực sự như AES sử dụng XOR cộng với khuếch tán và thay thế để khuếch đại một khóa ngắn thành một luồng byte giả ngẫu nhiên trông giống như một sổ tay một lần đối với bất kỳ ai không có khóa. Vì vậy «mã hóa với XOR» chỉ tốt cho việc làm rối tầm thường, không bao giờ cho các bí mật thực sự.

Khi nào tôi nên sử dụng BigInt thay vì Number để thao tác bit?

Bất cứ khi nào bạn cần độ chính xác bitwise nhiều hơn 32 bit. Các toán tử bitwise JavaScript cắt ngắn các toán hạng Number thành số nguyên có dấu 32-bit trước khi tính toán. Nếu bạn cần mặt nạ 64-bit (ví dụ: thao tác một bộ cờ tính năng 64-bit, làm việc với offset mmap Linux, hoặc triển khai SHA-512), hãy sử dụng BigInt: 0xFFFFFFFFFFFFFFFFn & 0xFFn === 255n. BigInt chậm hơn Number, ~3-10× tùy thuộc vào hoạt động, vì vậy hãy dành nó cho các trường hợp 32 bit thực sự quá ít.

Làm thế nào để đếm số bit 1 trong một số?

Đây là đếm dân số hoặc trọng số Hamming. Hầu hết các CPU hiện đại đều có một lệnh duy nhất cho điều đó (POPCNT trên x86, VCNT trên ARM). Trong JavaScript, không có sẵn, vì vậy hãy sử dụng kinh điển bit-twiddling: let c = 0; while (x) { c += x & 1; x >>>= 1; }. Hoặc thủ thuật SWAR song song từ Hacker's Delight: x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; return (x * 0x01010101) >>> 24;, đếm các bit trong một số nguyên 32-bit trong khoảng một tá chu kỳ.

Dữ liệu của tôi có được gửi đi đâu khi tôi sử dụng máy tính này không?

Không. Mọi hoạt động chạy trong động cơ JavaScript của trình duyệt của bạn, không có cuộc gọi mạng nào xảy ra trong khi tính toán. Mở tab Mạng trong DevTools và nhấp Tính, bạn sẽ thấy không có yêu cầu đi ra. An toàn cho các mask nhạy cảm, khóa hoặc công việc bố cục bit độc quyền.

Công cụ liên quan

Trình chuyển đổi nhị phân sang văn bản Trình Chuyển Đổi Cơ Số Số Máy tính Chmod Trình tạo Hash miễn phí