01/10/2018, 17:19

Các thao tác trên bit?

Em có 2 đoạn code muốn hỏi mọi người.

Tại sao phải nhớ các phép toán thao tác trên bit trong khi ta có thể gán giá trị như hình 2 ạ?

Em có đọc vài tài liệu thì có nói các thao tác trên bit sẽ giúp tăng tốc độ xử lý nhưng khi cho run code thì kiểu gán giá trị nó còn run nhanh hơn kiểu thao tác trên bit. Mỗi lần sử dụng một thao tác trên bit thì phải giấy bút biểu diễn dạng nhị phân rồi mới đưa vào code?

Em đang mông lung không biết ứng dụng cụ thể của các phép toán trên bit này là gì.

Mong mọi người giải đáp, em cảm ơn

int main()
{
    unsigned char A = 45;
    unsigned char result;
    result = A << 4; // phep toan tren bit
    printf("Vay ket qua A << 4: %d
", result);
    return 0;
}
Vay ket qua A << 4: 208
int main()
{
     unsigned char A = 208;
     printf("Vay so do la: %d", A);
     return 0;
}
Vay so do la: 208
Vuio viết 19:34 ngày 01/10/2018

Cứ hiểu nôm na phép toán dịch bit như thế này:

  • A << B (dịch số A sang trái B bit) kết quả là A x 2^B
  • A >> B (dịch số A sang phải B bit) kết quả là A / 2^B (chia lấy nguyên, giống div trong pascal)

Trường hợp của bạn, dịch số 45 sang trái 4 bit, nghĩa là nhân số 45 cho 2^4

45 * 2^4 = 720

Kết quả 720 vượt quá phạm vi của kiểu unsigned (phạm vi 0 - 255) nên máy tính sẽ lấy kết quả là mod của 720 cho 256

720 mod 256 = 208

Lâu rồi thì phép dịch bit dùng để thực hiện phép nhân và chia cho lũy thừa của 2 nhằm tăng tốc độ. Bây giờ thì hầu như compiler nào cũng được tối ưu hóa cho hai phép toán này rồi nên ít dùng.

phamvandung viết 19:19 ngày 01/10/2018

bitwise không chỉ có dịch chuyển & quay bit.

HoangLong.hcmus viết 19:29 ngày 01/10/2018

a cho e hỏi tại sao nó lại lấy mod cho 256 mà ko phải là 255 ạ? có phải nó luôn luôn lấy mod cho 1 số lớn hơn phạm vi của kiểu dữ liệu 1 đơn vị? e cảm ơn

Aster-Dynos viết 19:23 ngày 01/10/2018

Nó mod 256 bởi vì phạm vi từ 0 tới 255 có 256 con số (1-255 có 255 con số, rồi bạn phải tính thêm số 0 nữa —> 256)

HoangLong.hcmus viết 19:23 ngày 01/10/2018

à em hiểu rồi cảm ơn a nhiều ạ

Tao Không Ngu. viết 19:29 ngày 01/10/2018

Hi HoangLong.hcmus.
Thường thì đi xe máy nhanh hơn đi xe đạp nhưng nếu bạn không biết lái xe máy mà dắt bộ thì nó còn chậm hơn đi bộ. Bạn cần biết về nó cách dùng ưu nhược điểm trước.
VD: Cho số a tìm số chẵn lớn nhất không vượt quá a (7 -> 6; 8 -> 8).
v1 a % 2 ? a - 1 : a
v2 ((a / 2) * 2)
v3 (a >> 1) << 1
v4 ((int) a) & 0xfff0

rogp10 viết 19:31 ngày 01/10/2018

có phải nó luôn luôn lấy mod cho 1 số lớn hơn phạm vi của kiểu dữ liệu 1 đơn vị

Đúng (lưu ý là đừng dùng kiểu có dấu). Vì 256 là 1 chữ số 1 đứng trước 8 chữ số 0 (= 2^8 ) trong hệ nhị phân. Tương tự với 16, 32, 64 bit.

Bài liên quan
0