Hướng dẫn dùng right shift trong PHP

Cũng giống như các phiên bản Windows trước, Windows 7 có một bộ phím tắt “vô giá” giúp người dùng tiết kiệm đáng kể thời gian và công sức cho những lần... di chuột.

Hướng dẫn dùng right shift trong PHP

Sau đây là những tổ hợp phím thường dùng nhất:

1. Windows (biểu tượng cửa sổ Windows trên bàn phím) + Left / Windows + Right.

Thao tác này giúp bạn phóng to/ giảm kích thước cửa sổ hiện hành một cách nhanh chóng mà không cần dùng chuột. Nếu cửa sổ hiện hành đang ở chế độ Full size, nó sẽ chuyển về chế độ cascade hoặc side by side tùy thuộc vào số cửa sổ hiện có trên màn hình. Tổ hợp phím này hỗ trợ bạn nhanh chóng trong việc chuyển các cửa sổ về hai dạng nêu trên nhằm thực hiện việc xem xét so sánh thuận lợi hơn trên nhiều cửa sổ cùng lúc.

2. Phím Windows + Shift + Left / Windows + Shift + Right

Nếu máy tính bạn cấu hình sử dụng nhiều màn hình, tổ hợp trên cho phép bạn di chuyển qua lại giữa các màn hình một cách nhanh chóng.

3. Phím Windows + Spacebar

Hệ thống phím này cho phép người dùng ẩn đi các cửa sổ hiện có trên màn hình để trở về màn hình desktop. Thao tác này giúp người dùng dễ dàng thao tác xem màn hình hiện hành, kiểm tra các thông tin trên cái gadget,…Khi bạn ngưng nhấn tổ hợp phím trên thì màn hình trả về cửa sổ vừa thao tác.

4. Phím Windows + phím “+” và “-”

Hệ thống cho phép bạn kết hợp giữa phím Windows và phím “+” /  “-” để phóng to / thu nhỏ vị trí cần xem, độ phóng to là tỉ lệ của 100%. Khi bạn nhấn tổ hợp phím này, hệ thống sẽ gọi chương trinh Magnifer để thực thi và xuất hiện biểu tượng chiếc kính lúp trên màn hình. Vị trí chiếc kính lúp xuất hiện là vị trí cần được phóng to trên màn hình.

5. Phím Alt + Up / Left / Right

Dùng tổ hợp phím này trên trình duyệt hoặc trên Windows Explorer sẽ giúp bạn di chuyển tới, lùi một thư mục hoặc một vị trí so với vị trí hiện hành mà bạn đang thao tác.

6. Phím Windows  + T hoặc Windows + #

Việc hiển thị dạng thumbnails các cửa sổ hiện hành giúp bạn dễ dàng xác định được cửa sổ cần mở to. Với phím tắt Windows + T bạn sẽ lần lượt duyệt qua các nhóm cửa sổ hiện có trên thanh Taskbar mà không cần bất kỳ một thao tác chuột nào. Tuy nhiên việc làm này không bao gồm thao tác xác định chỉnh xác cửa sổ dạng thumbnails nào được mở. Để kết hợp được việc mở cửa sổ thumbnails mà bạn cần, bạn thực hiện như sau: Khi xác định được nhóm ứng với cửa sổ cần mở, bạn không nhấn giữ phím Windows + T nữa mà chỉ phím mũi tên lên và kết hợp với phím mũi tên trái phải sau đó để xác định chính xác cửa sổ cần mở, cuối cùng nhấn enter để mở.

7. Phím Windows + M

Kết hợp tổ hợp phím này giúp bạn quay về màn hình desktop một cách nhanh chóng và chuyển tất cả các cửa sổ về dạng minimize.

8. Phím Windows + D

Dùng để thu nhỏ tất cả các cửa sổ hiện hành, trở về màn hình desktop nhưng điểm khác với Windows +M là bạn nhấn Windows + D lần nữa, hệ thống sẽ trả về cửa sổ vừa thao tác.

9. Phím Windows + Tab/ Windows + Shift + Tab

Kích hoạt chức năng Windows’ Flip 3D của Windows 7, sau mỗi khi bạn nhấn Windows + Tab các cửa sổ hiện hành sẽ cuộn theo chiều kim đồng hồ, khi bạn nhấn Windows + Shift+Tab, các cửa sổ sẽ cuộn theo chiều ngược lại.

10. Phím Ctrl + Windows + Tabs

Chế độ này dùng để “neo” chức năng Windows’ Flip 3D của Windows 7, khi chức năng Windows’ Flip 3D được thực thi, tại một cửa sổ bất kỳ, bạn nhả tổ hợp phím trên thì màn hình vẫn hiển thị ở chế độ Flip 3D.

11. Phím Windows + phím số

Các nhóm icon bên dưới Taskbar được hệ thống quy định và đánh số thứ tự tăng dần từ trái sang phải, bạn muốn thao tác nhanh đến nhóm nào, hãy nhấn phím Windows + và phím số ứng với thứ tự của nhóm icon đó, khi đó cửa sổ tương ứng sẽ hiện ra. Trong trường hợp nhóm icon đó có nhiều cửa sổ, bạn lần lượt nhấn phím Windows + và phím số ứng với thứ tự của nhóm icon đó để di chuyển sang các cửa sổ khác trong cùng nhóm.

12.Phím Alt/Shift + Windows + phím số

Với tổ hợp phím Alt + Windows + phím số tương ứng với nhóm icon được gọi đến, bạn có thể bật hộp thoại hiển thị danh sách các tác vụ được thực hiện trên nhóm icon trước đó. Hành động này thay cho việc click phải chuột lên nhóm icon cần hiển thị danh sách.

Với tổ hợp phím Shift + Windows + phím số tương ứng, bạn sẽ gọi mới một thể hiện của nhóm icon đó và một cửa sổ mới tương ứng hiện ra.

Tôi quyết định viết bài này vì chủ đề này là kĩ năng thứ 2 cần thiết cho một lập trình viên nhúng - embedded - chiêu trò với low level bit. Bit hack là những mẹo lập trình vô cùng khéo léo để xào xáo những số nguyên theo một cách thông minh và hiệu quả vô cùng. Thay vì thực hiện các phép tính (như là đếm số lượng bit 1 của một số nguyên) bằng cách lặp qua từng bit riêng lẻ, những mẹo lập trình này làm điều tương tự chỉ với 1 hoặc 2 toán tử bitwise được lựa chọn kĩ càng.

Để có thể tiếp tục cùng nhau khám phá, tôi mong rằng bạn đã biết cách bù 2 biểu diễn nhị phân của một số nguyên và cũng biết tất cả về toán tử bitwise. Tôi sẽ sử dụng những kí hiệu sau cho những toán tử bitwise được sử dụng trong bài viết:

&   -  bitwise and
|   -  bitwise or
^   -  bitwise xor
~   -  bitwise not
<<  -  bitwise shift left
>>  -  bitwise shift right

Những số được sử dụng trong bài viết này là những số nguyên 8 bit signed -từ -128 đến 127 (các toán tử này có thể hoàn toàn thực hiện với số nguyên với độ dài bit lớn hơn) được biểu diễn bằng phương pháp bù 2 và được đặt tên là 'x'. Kết quả thường là 'y'. Từng bit riêng lẻ của 'x' được đặt tên là b7, b6, b5, b4, b3, b2, b1 và b0. Bit b7 là bit quan trọng nhất và là bit lớn nhất, và b0 là bit nhỏ nhất.

Tôi sẽ bắt đầu từ những mẹo dễ nhất rồi đến cái khó hơn. Và sẽ có ví dụ cụ thể cho mỗi mẹo để giải thích cách chúng hoạt động.

Nào chiến thôi!

Mẹo hack bit #1. Kiểm tra xem số nguyên là số chẵn hay lẻ.

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}

Tôi chắc rằng mọi người đều đã biết tới trick này. Ý tưởng ở đây là nếu số nguyên đó lẻ khi và chỉ khi bit nhỏ nhất b0 là 1. Ta phải biểu diễn nhị phân 'x' để biết b0 là 1 hay là 0. Bằng phép toán AND & 'x' với 1 chúng ta đã loại bỏ tất cả bit khác ngoài b0. Nếu kết quả phép toán này là 0, thì 'x' sẽ là số chẵn vì bit b0 là 0. Còn lại 'x' sẽ là lẻ.

Hãy nhìn vô ví dụ dưới đây. Ví dụ số nguyên 43, là số lẻ. Dạng nhị phân của 43 là 00101011. Để ý rằng bit nhỏ nhất b0 là 1 (in đậm đó). Bây giờ hãy AND nó với 1:

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001

Chúng ta thấy toán tử AND đã xóa tất cả các bit cao hơn từ b1-b7 nhưng giữ nguyên bit b0 ? Kết quả là 1 nói cho chúng ta biết rằng số nguyên đó là số lẻ.

Bây giờ lấy -43 làm ví dụ tiếp nào. Nhắc nhẹ các bạn, một cách nhanh để biểu diễn số theo bù 2 là đảo ngược tất cả các bit và thêm 1. Vì thế -43 sẽ là 11010101 trong hệ nhị phân. Chú ý tiếp rằng bit cuối cùng lại là 1, và số nguyên đó là lẻ. (Chú ý nếu chúng ta sử dụng bù 1 thì nó sẽ không còn đúng nữa!).

Bây giờ lấy ví dụ là một số nguyên chẵn 98. Trong hệ nhị phân 98 là 1100010.

    01100010
&   00000001
    --------
    00000000

Sau khi thực hiện phép toán AND với 1 ta được kết quả là 0. Nó có nghĩa là bit b0 của số nguyên 98 là 0. Do đó số nguyên đã cho là số chẵn.

Bây giờ số -98 thì sao. Nó là 10011110. Và bit b0 là 0 và sau khi AND với 1 ta lại được kết quả là 0 vì vậy -98 cũng là số chẵn, hiển nhiên voãi :)).

Mẹo hack bit #2. Kiểm tra xem bit thứ n có giá trị không.

if (x & (1<<n)) {
  bit thứ n có giá trị //là bit 1 đó
}
else {
  bit thứ n không có giá trị
}

Ở mẹo hack bit trước chúng ta thấy rằng (x & 1) để kiểm tra xem bit đầu tiên có giá trị hay không. Ở mẹo này chúng ta chỉ cần nâng kết quả lên và kiểm tra xem bit thứ n có giá trị hay không. Nếu ta di chuyển bit 1 n vị trí sang bên trái và thực hiện phép toán AND, để loại bỏ toàn bộ các bit khác trừ bit thứ n.

Đây là cách chúng ta di chuyển 1 vài bước sang trái:

1         00000001    (cũng giống 1<<0)
1<<1      00000010
1<<2      00000100
1<<3      00001000
1<<4      00010000
1<<5      00100000
1<<6      01000000
1<<7      10000000

Bây giờ nếu chúng ta AND với 1 mà đã được dịch chuyển n vị trí sang trái thì ta sẽ dễ dàng loại bỏ toàn bộ các bit khác trừ bit thứ n của 'x'. Nếu kết quả là 0 thì bit đó sẽ là 0, còn đâu thì bit đó đã có giá trị.

Hãy thử làm một vài ví dụ khác nhé.

Số 122 có bit thứ 3 là 1 không? Phép toán chúng ta cần thực hiện sẽ là:
 

122 & (1<<3)

122 sẽ là 01111010 trong hệ nhị phân. Và (1<<3) là 00001000

    01111010
&   00001000
    --------
    00001000

Chúng ta thấy kết quả không phải là 0 nên 122 có bit thứ 3 có giá trị.

Chú ý: Trong bài viết này đánh thứ tự bit từ 0. Nên nó sẽ có dạng bit thứ 0, thứ 1,..., thứ 7.

Thế còn -33? Nó có bit thứ 5 có giá trị?

    11011111      (-33 trong hệ nhị phân)
&   00100000     (1<<5)
    --------
    00000000

Kết quả là 0, vì thế bit thứ 5 không có giá trị.

Mẹo hack bit #3. Đặt giá trị cho bit thứ n.

y = x | (1<<n)

Mẹo hack bit này kết hợp mẹo (1<<n) để cài đặt bit thứ n bằng shifting và kết hợp với toán tử OR. Kết quả của việc OR-ing một biến với một giá trị mà bit thứ n được đặt sẽ bật bit thứ n đó lên. Bởi vì nếu OR-ing bất kì giá trị nào với 0 sẽ giữ nguyên giá trị đó; nhưng OR-ing với 1 sẽ đổi nó thành 1 (nếu nó là 0). Hãy xem nó hoạt động ra sao nhé:

Giả sử ta có số 120, và chúng ta muốn bật bit thứ 2 lên. (từ 0 => 1).

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
0

Thế còn -120 và bit thứ 6 thì sao?

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
1

Mẹo hack bit #4. Tắt bit thứ n (1 => 0).

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
2

Điểm cốt yếu của mẹo này là ~(1<<n). Nó sẽ bật tất cả các bit trừ bit thứ n.

Đây là cách nó hoạt động:

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
3

Và khi ta AND biến 'x' thì nó sẽ loại bỏ bit thứ n. Ta chẳng cần quan tâm ở bit thứ n là 0 hay 1, với AND với 0 thì sẽ luôn luôn thành 0.

Ví dụ nè. Hãy tắt bit thứ 4 của 127:

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
4

Mẹo hack bit #5. Đảo chiều bit thứ n.

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
5

Mẹo hack bit này cũng sử dụng cách tuyệt vời "mẹo đặt bit thứ n bằng shift" nhưng lần này nó sử dụng toán tử XOR với biến 'x'. Kết quả của việc XOR-ing 2 thứ với nhau đó là nếu 2 bit giống nhau thì kết quả là 0, nếu khác nhau thì sẽ là 1. Vậy thì làm cách nào mà nó đảo chiều bit thứ n? Đây nhé, nếu bit thứ n là 1 thì XOR-ing nó với 1 giống nó nên sẽ thành 0; ngược lại nếu nó là 0 thì XOR-ing nó với 1 khác nó nên sẽ thành 1. Đó, bit đó đã bị đảo ngược.

Đây là một ví dụ nè. Giả sử bạn muốn đảo chiều bit thứ 5 của 01110101:

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
6

Thế còn trường hợp bit thứ 5 vốn là 0 thì sao?

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
7

Bạn có để ý thấy gì không? XOR-ing cùng một bit 2 lần thì sẽ trả lại giá trị của nó ban đầu. Đặc tính tuyệt vời này của XOR được sử dụng để tính toán tính đối gương trong mảng RAID và sử dụng với mã hóa mật mã đơn giản và trong nhiều vấn đề khác.

Mẹo hack bit #6. Tắt bit-1 gần nhất từ phải sang.

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
8

Bắt đầu thú vị hơn rồi đây!!! Mẹo số 1 -> 5 khá là buồn chán đó.

Mẹo hack bit này tắt bit-1 gần nhất từ phải sang. Ví dụ, cho 1 số nguyên 00101010 (bit-1 gần nhất từ phải sang được bôi đậm đó) ta cần chuyển nó thành 00101000. Hoặc là nếu cho 00010000 ta sẽ biến thành 0 bởi bì nó chỉ có duy nhất một bit-1.

Đây là một số ví dụ khác:

if ((x & 1) == 0) {
  x is chẵn
}
else {
  x is lẻ
}
9

Tại sao lại có điều kì diệu này?

Nếu bạn nhìn vào những ví dụ này và suy ngẫm, bạn sẽ nhận ra rằng có 2 trường hợp có thể xảy ra:

1. Số này có bit-1 gần nhất từ phải sang. Trong trường hợp này nếu ta trừ 1 đi từ nó sẽ chuyển tất cả các bit thấp hơn bit-1 đó thành 1 và bit-1 gần nhất từ phải sang đó sẽ thành 0 (vì thế nếu giờ bạn cộng với 1 bây giờ thì bạn sẽ lấy lại được số gốc). Bước này sẽ giúp ta chỉ điểm được bit-1 gần nhất từ phải sang đó và giờ khi AND-ing nó với giá trị gốc thì sẽ làm biến mất bit-1 gần nhất bên phải đó.

2. Số này không có bit-1 nào cả (tất cả đều 0). Trong trường hợp này trừ 1 sẽ biến đổi số đó (bởi nó là signed có cả âm dương) và đặt tất cả các bit thành 1. AND-ing tất cả 0 với tất cả 1 thì vẫn ra 0 mà thôi.

Mẹo hack bit #7. Tách biệt bit-1 gần nhất bên phải.

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
0

Mẹo hack bit này tìm ra bit-1 gần nhất bên phải và đặt tất cả các bit khác về 0. Kết quả cuối cùng chỉ còn bit-1 gần nhất bên phải là còn giá trị. Ví dụ, 01010100 (bit-1 gần nhất bên phải bôi đậm) phải biến thành 00000100.

Đây là một vài ví dụ khác:

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
1

Mẹo hack bit này hoạt động được bởi "bù 2". Trong hệ "bù 2" -x sẽ bằng là ~x+1. Bây giờ ta sẽ xem xét 2 trường hợp có thể xảy ra sau:

1. Nếu có bit-1 gần nhất bi. Trong hãy xem xét bit này và chia nó thành thành 2 phần - các bit bên phải và các bit bên trái. Nhớ rằng tất cả các bit bên phải bi-1, bi-2, ... b0 đều là 0 (bởi bi là bit-1 gần nhất từ bên phải). Và các bit bên trái thì vẫn giữ nguyên. Hãy gọi chúng là bi+1, ..., bn.

Bây giờ khi ta tính -x, đầu tiên ta tính ~x sẽ làm bit bi thành 0, bi-1, bi-2, ... b0 sẽ thành 1 và sẽ đảo ngược tất cả các bit bi+1, ..., bn và sau đó ta cộng 1 vào kết quả này.

Do các bit bi-1, bi-2, ... b0 đều là 1, cộng thêm 1 sẽ làm chúng chuyển 1 này chạy một mạch tới bit bi, bởi nó là bit-0 đầu tiên từ phải.

Gộp tất cả lại, kết quả của việc -x là các bit từ bi+1, ..., bn  sẽ bị đảo ngược, bit bi giữ nguyên và các bit bi-1, bi-2, ... b0 sẽ đều là 0.

Bây giờ khi AND-ing x với -x sẽ làm các bit từ bi+1, ..., bn  sẽ thành 0 hết, bit bi sẽ giữ nguyên và các bit bi-1, bi-2, ... b0 sẽ đều là 0. Chỉ còn 1 bit ở lại, đó chính là bit bi là bit-1 gần nhất từ phải sang.

2. Không có bit-1 nào cả. Số đã cho là 0. Âm của 0 trong "bù 2" thì vẫn là 0 do vậy 0&0 = 0. Không có bit nào được bật cả.

Chúng ta đã chứng minh được mẹo hack bit này đúng một cách chặt chẽ rùi đó.

Mẹo hack bit #8. Đặt giá trị cho tất cả các bit bên phải của bit-1 gần nhất bên phải.

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
2

Để hiểu mẹo này tốt nhất là làm luôn ví dụ. Cho 1 số 01010000 nó sẽ phải biến thành 01011111. Tất cả bit-0 ở phía bên phải của bit-1 gần nhất bên phải nó đều biến thành 1.

Đây không phải là một mẹo hoàn toàn chuẩn, bởi, nó sẽ tạo ra tất cả 1 nếu x = 0.

Hãy nhìn vào các ví dụ sau:

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
3

Hãy chứng minh nó nào, bởi không chặt chẽ như mẹo hack bit trước (bởi tốn thời gian quá và đây cũng đâu phải báo cáo khoa học gì đâu :v). Lại có 2 trường hợp nè. Hãy bắt đầu với cái dễ hơn trước.

1. Không có bit-1 nào gần nhất bên phải. Tức là x = 0 và x - 1 sẽ là -1. -1 trong "bù 2" sẽ là 11111111. Or-ing 0 với 11111111 sẽ ra 11111111. (Không phải là kết quả mong muốn nhưng mà kệ nó vậy).

2. Có bit-1 gần nhất bên phải ở bit thứ i bi. Lại chia các bit thành 2 nửa (giống ví dụ trước). Làm tính (x-1) sẽ chỉ thay đổi các bit ở bên phải, biến bi thành 0, và tất cả bit dưới nó thành 1. Bây giờ OR-ing x với x-1 sẽ giữa nguyên các bit cao hơn (bên trái), giữ nguyên bit bi bởi nó vốn là 1, và tất cả các bit dưới nó sẽ được bật thành 1 hết. Kết quả là bit-1 gần nhất bên phải sẽ biến tất cả các bit dưới nó thành 1 hết.

Mẹo hack bit #9. Tách biệt bit-0 gần nhất bên phải.

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
4

Mẹo hack bit này ngược lại với mẹo số 7. Nó sẽ tìm ra bit-0 gần nhất bên phải rồi sẽ tắt tất cả các bit còn lại và đặt cho bit-0 này thành 1. Ví dụ nó sẽ tìm ra 0 được bôi đậm trong số sau 10101011, và tạo ra 00000100.

Thêm các ví dụ:

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
5

Chứng minh: Giả sử có bit-0 gần nhất bên phải. Khi ta tính ~x (not x) thì biến bit này từ 0 thành 1. Và cũng như vậy x + 1 (bởi vì các bit bên phải của bit-0 gần nhất bên phải đều là 1). Bây giờ khi AND-ing ~x với x+1 nó sẽ làm bốc hơi tất cả các bit bên trên bit-0 gần nhất bên phải này. Đó là các bit cao hơn nó. Bây giờ còn các bit bên phải của bit-0 này? Chúng cũng bị bốc hơi luôn vì x+1 biến chúng thành 0 hết (vốn đều là 1) và ~x thì cũng biến chúng thành 0. Chúng sẽ AND-ing với 0 do đó sẽ bị bay màu hết.

Mẹo hack bit #10. Bật bit-0 gần nhất bên phải.

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
6

Mẹo này biến bit-0 gần nhất bên phải thành 1. Ví dụ cho số nguyên 10100011 nó sẽ biến thành 10100111.

Thêm các ví dụ nè:

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
7

Đây là cách chứng minh. OR-ing x với x+1 không làm mất đi số nào cả. Cộng thêm 1 vào x sẽ đổ đầy bit-0 đầu tiên bên phải. Kết quả sẽ là max{x,x+1}. Nếu x+1 bị quá giới hạn thì kết quả chính là x và không có bit-0 nào cả. Nếu không thế nó sẽ là x+1 với tất cả bit bên phải đều lấp đầy bởi 1.

Hàng khuyến mãi.

Nếu bạn muốn chơi đùa nhiều hơn với những mẹo này, đây là hàm để in dạng hệ nhị phân của 1 số nguyên 8 bit signed trong Pert, Python và C:

Perl:

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
8

Hoặc là với dòng lệnh:

    00101011
&   00000001  (chú ý: 1 biểu diễn nhị phân là 00000001)
    --------
    00000001
9

Python:

    01100010
&   00000001
    --------
    00000000
0

C:

    01100010
&   00000001
    --------
    00000000
1

Thêm nữa nè: Có một cuốn sách chuyên về bit hack là "Hacker's Delight". Bạn sẽ yêu nó nếu bạn yêu thích vấn đề này.