Mặc dù câu trả lời được chấp nhận chỉ ra rằng endianess là một khái niệm từ chế độ xem bộ nhớ. Nhưng tôi không nghĩ rằng trả lời câu hỏi trực tiếp.
Một số câu trả lời cho tôi biết rằng các phép toán bitwise không phụ thuộc vào endianess và bộ xử lý có thể biểu diễn các byte theo bất kỳ cách nào khác. Dù sao, nó đang nói về endianess được trừu tượng hóa.
Nhưng khi chúng ta thực hiện một số tính toán từng chút một trên tờ giấy chẳng hạn, không cần nêu trạng thái cuối cùng ở vị trí đầu tiên? Hầu hết thời gian chúng tôi chọn một endianess ngầm.
Ví dụ: giả sử chúng ta có một dòng mã như thế này
0x1F & 0xEF
Làm thế nào bạn sẽ tính toán kết quả bằng tay, trên một tờ giấy?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Vì vậy, ở đây chúng tôi sử dụng định dạng Big Endian để thực hiện tính toán. Bạn cũng có thể sử dụng Little Endian để tính toán và nhận được kết quả tương tự.
Btw, khi chúng tôi viết số bằng mã, tôi nghĩ nó giống như một định dạng Big Endian. 123456
hoặc 0x1F
, hầu hết các số có ý nghĩa bắt đầu từ bên trái.
Một lần nữa, ngay khi chúng tôi viết một số định dạng nhị phân của một giá trị lên tờ giấy, tôi nghĩ rằng chúng tôi đã chọn một Endianess và chúng tôi đang xem giá trị như chúng tôi thấy từ bộ nhớ.
Vì vậy, quay trở lại câu hỏi, một hoạt động thay đổi <<
nên được coi là chuyển từ LSB (byte có ý nghĩa nhỏ nhất) sang MSB (byte quan trọng nhất) .
Sau đó, như ví dụ trong câu hỏi:
numb=1025
Little Endian
LSB 00000001 00000100 00000000 00000000 MSB
Vì vậy, << 10
sẽ được 10bit
chuyển từ LSB sang MSB.
So sánh và << 10
thao tác cho định dạng Little Endian từng bước:
MSB LSB
00000000 00000000 00000100 00000001 numb(1025)
00000000 00010000 00000100 00000000 << 10
LSB MSB
00000000 00000100 00010000 00000000 numb(1025) << 10, and put in a Little Endian Format
LSB MSB
00000001 00000100 00000000 00000000 numb(1205) in Little Endian format
00000010 00001000 00000000 00000000 << 1
00000100 00010000 00000000 00000000 << 2
00001000 00100000 00000000 00000000 << 3
00010000 01000000 00000000 00000000 << 4
00100000 10000000 00000000 00000000 << 5
01000000 00000000 00000001 00000000 << 6
10000000 00000000 00000010 00000000 << 7
00000000 00000001 00000100 00000000 << 8
00000000 00000010 00001000 00000000 << 9
00000000 00000100 00010000 00000000 << 10 (check this final result!)
Ồ Tôi nhận được kết quả mong đợi như OP mô tả!
Các vấn đề mà OP không nhận được kết quả như mong đợi là:
Có vẻ như anh ấy đã không chuyển từ LSB sang MSB.
Khi dịch chuyển bit theo định dạng Little Endian, bạn nên nhận ra (cảm ơn chúa tôi nhận ra điều đó) rằng:
LSB 10000000 00000000 MSB << 1
là
LSB 00000000 00000001 MSB
, không
LSB 01000000 00000000 MSB
Bởi vì đối với mỗi cá nhân 8bits
, chúng tôi thực sự đang viết nó theo MSB 00000000 LSB
định dạng Big Endian.
Vì vậy, nó giống như
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Tóm lại:
Mặc dù các thao tác bitwise được cho là đã được trừu tượng hóa bằng blablablabla ..., khi chúng ta tính toán các thao tác bitwise bằng tay, chúng ta vẫn cần biết chúng ta đang sử dụng cái gì khi chúng ta viết ra định dạng nhị phân trên giấy. Ngoài ra, chúng ta cần đảm bảo tất cả các toán tử sử dụng cùng một endianess.
OP đã không nhận được kết quả như mong đợi là vì anh ta đã làm sai.