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
Cứ hiểu nôm na phép toán dịch bit như thế này:
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.
bitwise không chỉ có dịch chuyển & quay bit.
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
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)
à em hiểu rồi cảm ơn a nhiều ạ
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
Đú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.