1.Làm sao để set một bit trong số " num":
- Nếu chúng ta muốn set một bit tại một vị trí n trong số num, chúng ta có thể dùng toán tử OR ( | )
- Đầu tiên , chúng ta dịch trái số 1 với số bit dịch là n: 1<<n.
- Sau đó sử dụng toán tử OR tại vị trí n. Sở dĩ toán tử OR được dùng vì nó set một bit mà không quan tâm đến giá trị của từng bit trong dãy nhị phân của số " num ".
num=0100, set bit 1 tại vị trí 1 ( pos=1 ) . Tưởng tượng num giống như mảng, tức set bit 1 tại vị trí num[1], sau khi set sau num=0110 tức bằng 6.
2) Làm sao để unset/clear một bit tại vị trí n trong số " num "
- Gỉa sử rằng chúng ta muốn unset một bit tại vị trí n trong số " num" do đó chúng ta phải nhờ sự giúp của toán tử AND ( &).
- Đầu tiên chúng ta dịch trái số 1 với n bit dịch hơn nữa cũng dùng toán tử NOT (~) để unset kết quả của shifted "1 ".
- Sau khi clear sau xong kết quả của shifted " 1", ta thực hiện nó với số " num " bằng toán tử AND (&).
num=0111, kết quả của 1<<pos là 1110, sau khi thực hiện toán tử NOT ta được 0001, thực hiện AND với num ta được 01110.Vậy là với pos=1, ta đã thực hiện xong unset.
3) Toggling một bit tại vị trí n:
- Toggling có nghĩa là nếu bit tại trí n đang là có giá trị là 0 thì sẽ turn lên 1 và ngược lại. Sử dụng toán tử XOR. Do đặc điểm của XOR giữa 2 bit luôn cho kết quả 0 nếu 2 bit có cùng giá trị.
num=0100, kết hợp với (1<<pos=0010) bằng toán tử XOR ( ^ ), ta được 0110.ở đây ta xem num như mảng và Toggling tại pos=1 thì xem như tại num[1].
4) kiểm tra xem tại vị trí n đang là set hay unset:
num=0101 và 1<<pos=0001. Kết quả khi thực hiện toán tử AND=0001, dùng kiểu bool nên bit=1. Xem num như mảng, tức kết quả có được cho thấy tại num[0], giá trị bit đang set.
5) Stripping off the lowest set bit ( Loại bỏ bit thấp nhấp được set lên 1 )
Ở ví dụ trên num=7=0111, ta mong muốn loại bỏ bit được set lên 1 cuối cùng, ta lấy 7-1=6=0110, sau đó AND num, ta được 0110.
xét ví dụ với num=14=1110, một cách diễn đạt khác, phép tính num-1=14-1=1101 có thể được diễn giải theo thao tác trên bit như sau: xét từ bit trái của numsang phải, nếu gặp bit được set lên 1 cuối cùng thì đảo lại thành bit 0 và kể từ đó, đảo tất các bit sau bit cuối cùng được set lên 1, tức ta sẽ được kết quả 1101=13, thực hiện AND với num ta đã hoàn thành việc loại bỏ bit cuối cùng được set lên 1.
6)Getting lowest set bit of a number( lấy bit được set thấp nhất)
Ta thấy num=10=1010, ta mong muốn get bit được set cuối cùng, tức mong muốn đạt được kết quả là 0010. Đầu tiên đảo số num thành số âm bằng 2 cách:
+ Dùng 1's complement( biến num thành số bù 1)+ 2's complement(+1 để thành số bù 2) tức phép toán ~num+1
+ Dùng - num.
Ta thực hiện 1 trong 2 cách trên, sau đó lấy kết quả trên AND với num ta được kết quả mong muốn ban đầu là 0010.
Tham khảo: geeksforgeeks
Edited by me " NÓI THẬT, LÀM THẬT ! "
Đọc tiếp »