2010-10-13 33 views

Trả lời

26

Máy tính là thiết bị nhị phân. Bởi vì điều này, các con số được biểu thị bằng một chuỗi các số 1 và 0.

Bitshifting chỉ đơn giản là di chuyển các chuỗi 1s và 0 sang trái hoặc sang phải.

Vì vậy, tất cả toán tử >> sẽ chuyển bit về phía bên phải một bit.

Xem xét số 101:

// Assuming signed 8-bit integers 
01100101 // How 101 is represented in binary 
00110010 // After right shifting one bit, this represents 50 

Bit quan trọng nhất trong trường hợp này đã được cắt ngắn. Rõ ràng là ma quỷ trong các chi tiết, nhưng đó là tất cả có thực sự với nó.

Nhà điều hành << hiện các hoạt động ngược lại:

// Assuming signed 8-bit integers 
01100101 // How 101 is represented in binary 
11001010 // After left shifting one bit, this represents -54 

// Assuming unsigned 8-bit integers 
01100101 // How 101 is represented in binary 
11001010 // After left shifting one bit, this represents 202 

Trong trường hợp này, các bit quan trọng nhất đã được cắt bớt kể từ khi tôi chỉ sử dụng 8-bit. Nếu số có nhiều bit hơn, tuy nhiên:

// Assuming signed 16-bit integers 
00000000 01100101 // How 101 is represented in binary 
00000000 11001010 // After left shifting one bit, this represents 202 
00000001 10010100 // After left shifting one bit again, this represents 404 

Vì vậy, bạn có thể nhận được các số khác nhau tùy thuộc vào số bit và loại dữ liệu liên kết với các bit bạn đang xử lý.

Phụ lục: Nếu bạn đang băn khoăn về cách thức hoạt động của nhị phân, hãy suy nghĩ về cách hệ thống số thập phân hoạt động. Hãy xem xét các số 5287. Nó có thể được viết như thế này:

5287 

Nhưng bạn cũng có thể viết nó ra như thế này:

5287 = (5 * 1000) + (2 * 100) + (8 * 10) + (7 * 1) 

nào bạn có thể viết ra như thế này:

5287 = (5 * 10^3) + (2 * 10^2) + (8 * 10^1) + (7 * 10^0) 

Phương trình trên giải thích lý do hệ thống số thập phân đôi khi được gọi là hệ cơ số 10. Hệ thống số thập phân sử dụng 10 chữ số (0-9). Lưu ý cách các số mũ tương ứng với vị trí chữ số.

Hệ thống số nhị phân hoặc hệ cơ số 2, là chính xác nhưng với số hai làm cơ số của số mũ và chỉ sử dụng hai chữ số: 0 và 1.

5287 = 00010100 10100111 (base 2) 
    = (0 * 2^15) + (0 * 2^14) + (0 * 2^13) + (1 * 2^12) 
    + (0 * 2^11) + (1 * 2^10) + (0 * 2^9) + (0 * 2^8) 
    + (1 * 2^7) + (0 * 2^6) + (1 * 2^5) + (0 * 2^4) 
    + (0 * 2^3) + (1 * 2^2) + (1 * 2^1) + (1 * 2^0) 
+3

Thực tế, nó chia cho hai và số kia nhân với hai. –

+2

@Joeri Hendrickx: Đối với các số nguyên, '>>' thực tế giống như chia cho hai (theo cách nó tròn phụ thuộc vào định dạng chính xác) và '<<' trên thực tế giống như nhân với hai. Đó là một "mẹo" hữu ích nếu bạn cần nhân/chia cho hai bộ vi xử lý không có các chỉ lệnh nhân/chia. Hãy nhớ rằng, thủ thuật này chỉ hoạt động trên các số nguyên. Cố gắng lừa này trên số dấu chấm động dẫn đến rác. –

3

>> các nhà điều hành SHIFT RIGHT

Ví dụ:

class X 
     { 
     public static void main(String args[]) 
     { 
     System.out.println("20>>2 = "+20>>2); 
     } 
     }   

Output: 20>>2 = 5

Giải thích:

giá trị nhị phân của 20 là: 00000000000000000000000000010100

thay đổi tất cả các bit 2 vị trí sang phải 00000000000000000000000000000101

Nó sẽ cho 5 (2*2^2+0*2^1+1*2^0)

3

Tôi có thể đảm nhận đứa trẻ, tôi đang nói chuyện với biết một chút thông tin về nhị phân? :)

Tất cả số có thể được biểu diễn trong một số loại nhị phân, như vậy:

Base 10 : Base 2 
    1 : 0001 
    2 : 0010 
    3 : 0011 
    4 : 0100 
    5 : 0101 
    6 : 0110 
    7 : 0111 
    8 : 1000 

... và vân vân.

Toán tử dịch chuyển về cơ bản sẽ di chuyển tất cả các bit (1 hoặc 0) trên một vị trí. Vì vậy, ví dụ: 000.111 >> 1

thay đổi tất cả các bit trong 000.111 đúng bằng một số để sản xuất này:

thay đổi tất cả những bit còn lại để tạo ra sản phẩm này:

Nếu bạn thay đổi bởi nhiều hơn một, sau đó nó chỉ di chuyển các bit hơn nữa.

Bây giờ, tùy thuộc vào ngôn ngữ bạn đang sử dụng và loại số bạn đang làm việc, có thể phức tạp hơn một chút so với ngôn ngữ đó. Ví dụ, nếu bạn đang làm việc trong một ngôn ngữ mà "bit quan trọng nhất" (một trong những xa nhất bên trái trong một số) đại diện cho dù số lượng được ký kết hay không, sau đó ngôn ngữ sẽ phải đưa vào tài khoản.

Về mặt toán học, nếu bạn lấy số nguyên (và bỏ qua nguy cơ tràn, do máy tính hết dung lượng lưu trữ bit), hãy dịch sang trái 1 (< < 1) tương đương với phép nhân với 2, và dịch phải bằng 1 là tương đương với chia cho 2. (Hãy suy nghĩ một chút về "giá trị địa điểm" trong toán học nhị phân là giá trị, và điều đó sẽ có ý nghĩa)

0

Tôi đã từng viết an JApplet (bitorgel) and put it on my web page, trong đó một có thể chơi xung quanh với các toán tử bit. Bạn có thể dùng thử trực tiếp hoặc tải xuống nguồn. AFAIK họ làm việc giống nhau trong C, C++ và Java - có lẽ trong C# quá.

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