2010-02-25 22 views
7

Xin chào, tôi tự học về bitwise, và tôi thấy một nơi nào đó trên internet có sự thay đổi số học (>>) bằng một nửa số. Tôi muốn kiểm tra nó:Tại sao số học thay đổi một nửa số chỉ trong một số sự cố?

44 >> 1 returns 22, ok 
22 >> 1 returns 11, ok 
11 >> 1 returns 5, and not 5.5, why? 

Một Ví dụ:

255 >> 1 returns 127 
127 >> 1 returns 63 and not 63.5, why? 

Cảm ơn.

+1

Không được phép chia tách bit. Lấy làm tiếc. – leppie

+0

@leppie: huh ??? –

Trả lời

13

Toán tử dịch chuyển bit không thực sự chia cho 2. Thay vào đó, nó di chuyển các bit của số sang phải bằng số vị trí được cung cấp ở phía bên tay phải. Ví dụ:

00101100 = 44 
00010110 = 44 >> 1 = 22 

Chú ý cách các bit trong dòng thứ hai cũng giống như những dòng trên, chỉ đơn thuần chuyển một nơi ở bên phải. Bây giờ hãy xem ví dụ thứ hai:

00001011 = 11 
00000101 = 11 >> 1 = 5 

Đây chính xác là hoạt động tương tự như trước đây. Tuy nhiên, kết quả của 5 là do thực tế rằng bit cuối cùng được dịch chuyển sang phải và biến mất, tạo ra kết quả 5. Do hành vi này, toán tử dịch phải sẽ tương đương với chia cho hai và sau đó vứt đi phần còn lại hoặc phần thập phân.

+0

Trong câu đầu tiên, tôi nghĩ bạn muốn nói đúng. – Joel

+0

@ Joel: Bạn nói đúng. Đã sửa. –

+0

Vâng, hoạt động chính xác giống như phân chia số nguyên hoặc nhân với 2^n. – Tronic

1

Nhị phân không có khái niệm về số thập phân. Nó trả về giá trị cắt bớt (int).

11 = 1011 ở dạng nhị phân. Di chuyển sang phải và bạn có 101, 5 chữ số thập phân.

+0

Hoàn toàn có thể có các chữ số sau dấu 'thập phân' ở dạng nhị phân. 101.1 làm cho cảm giác hoàn hảo, chữ số sau khi điểm chỉ đơn giản là đại diện cho 2^-1 trong cùng một cách mà trong thập phân nó đại diện cho 10^-1. Vấn đề là kiểu dữ liệu không lưu trữ dữ liệu theo cách này, do đó trong thao tác bit shift giá trị bị cắt bớt. – JonC

2

11 trong hệ nhị phân là 1011

11 >> 1 

có nghĩa là bạn chuyển sang biểu diễn nhị phân của bạn sang bên phải bằng một bước.

1011 >> 1 = 101 

Sau đó, bạn có 101 trong hệ nhị phân là 1 * 1 + 0 * 2 + 1 * 4 = 5.
Nếu bạn đã làm 11 >> 2 bạn sẽ có kết quả là 10 trong ví dụ nhị phân 2 (1 * 2 + 0 * 1).

Chuyển bằng 1 sang bên phải biến đổi tổng (A_i * 2^i) [i = 0..n] theo tổng (A_ (i + 1) * 2^i) [i = 0..n-1 ] đó là lý do tại sao nếu số của bạn là ngay cả (tức là A_0 = 0) nó được chia cho hai. (xin lỗi cú pháp LateX được tùy chỉnh ... :))

0

Dịch chuyển bit giống như chia hoặc nhân với 2^n. Trong số nguyên arithmetics kết quả được làm tròn về 0 đến một số nguyên. Trong phép chuyển động bit arithmetics nổi, không được phép.

Chuyển bit cục bộ, thay đổi bit, và làm tròn chỉ đơn giản là các bit rơi ra một cạnh đơn giản bị loại bỏ (không phải là nó thực sự tính toán giá trị chính xác và sau đó làm tròn nó). Các bit mới xuất hiện trên cạnh đối diện luôn là số 0 cho phía bên tay phải và cho các giá trị dương. Đối với các giá trị âm, một bit được nối vào phía bên tay trái, sao cho giá trị vẫn âm (xem cách hoạt động của two's complement) và định nghĩa số học mà tôi đã sử dụng vẫn đúng.

0

Trong hầu hết các ngôn ngữ được nhập tĩnh, kiểu trả về của thao tác là ví dụ: "int". Điều này ngăn cản một kết quả phân số, giống như phân chia số nguyên.

(Có câu trả lời hay hơn về nội dung 'dưới mui xe', nhưng bạn không cần phải hiểu những câu hỏi cơ bản về hệ thống kiểu.)

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