Các Toán Tử Thao Tác Bit - Tài Liệu Text - 123doc
Có thể bạn quan tâm
- Trang chủ >>
- Kỹ Thuật - Công Nghệ >>
- Điện - Điện tử
Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (171.8 KB, 17 trang )
Các toán tử thao tác bitCác toán tử thao tác bit (tiếng Anh: bitwise operator) là các toán tử được sử dụng chung với một hoặc hai số nhị phân để tạo ra một phép toán thao tác bit. Hầu hết các toán tử thao tác bit đều là các toán tử một hoặc hai ngôi.[sửa]NOTToán tử thao tác bit NOT còn được gọi là toán tử lấy phầnbù (complement) là một toán tử một ngôi có nhiệm vụ phủđịnh luận lí từng bit của toán hạng của nó - tức đảo 0 thành 1 và ngược lại. Ví dụ, thực hiện phép toán NOT với số nhị phân 0111:NOT 0111 = 1000Trong các ngôn ngữ lập trình C, C++, Java, C#, toán tử thao tác bit NOT được biểu diễn bằng kí hiệu "~" (dấu ngã). Trong Pascal, toán tử này là "not". Ví dụ:x = ~y; // CHayx := not y; { Pascal }Câu lệnh trên sẽ gán cho x giá trị "NOT y" - tức phần bù của y. Chú ý rằng, toán tử này không tương đương với toán tử luận lí "not" (biểu diễn bằng dấu chấm than "!" trong C/C++). Về vấn đề này, xin xem ở bài toán tử hoặc các bài về ngôn ngữ C/C++.Toán tử NOT hữu dụng khi ta cần tìm bù 1 của một số nhị phân. Nó cũng có thể được sử dụng làm bước đầu tiên đểtìm số bù 2.[sửa]ORToán tử thao tác bit OR là một toán tử hai ngôi, có nhiệm vụ thực hiện tính toán (trên từng bit) với hai chuỗi bit có cùng độ dài để tạo ra một chuỗi bit mới có cùng độ dài vớihai chuỗi bit ban đầu. Trên mỗi cặp bit tương ứng nhau của hai toán hạng, toán tử OR sẽ trả về 1 nếu có một trong hai bit là 1, còn trong tất cả các trường hợp khác, OR sẽ tạo ra một bit 0. Ví dụ, thực hiện phép toán OR với hai số nhị phân 0101 và 0011: 0101OR 0011 = 0111Trong C, C++, Java, C#, toán tử thao tác bit OR được biểu diễn bằng kí hiệu "|" (vạch đứng). Trong Pascal, toán tử này là "or". Ví dụ:x = y | z; // CHay:x := y or z; { Pascal }Câu lệnh trên sẽ gán cho x kết quả của "y OR z". Chú ý rằng toán tử này không tương đương với toán tử luận lí "or" (biểu diễn bằng cặp vạch đứng "||" trong C/C++). Về vấn đề này, xin xem ở bài toán tử hoặc các bài về ngôn ngữ C/C++.Ứng dụng điển hình của toán tử thao tác bit OR là dùng để bật (set) một bit cụ thể trong một mẫu bit cho trước. Ví dụ: giả sử ta có mẩu bit 0010. Ta thấy, bit thứ nhất, thứ haivà thứ tư của mẩu chưa được bật (0), bây giờ, nếu ta muốn bật bit đầu tiên của mẩu, ta có thể sử dụng toán tử OR như minh họa sau: 0010OR 1000 1010Khi làm việc với các máy không có nhiều không gian bộ nhớ trống, các lập trình viên thường áp dụng kĩ thuật trên. Lúc đó, thay vì khai báo tám biến kiểu bool (C++) độc lập, người ta sử dụng từng bit riêng lẽ của một byte để biểu diễn giá trị cho tám biến đó.[sửa]XORCũng giống OR, toán tử thao tác bit XOR (còn gọi là OR có loại trừ - exclusive OR) cũng là một toán tử hai ngôi, có nhiệm vụ thực hiện tính toán (trên từng bit) với hai chuỗi bit có cùng độ dài để tạo ra một chuỗi bit mới có cùng độ dài với hai chuỗi bit ban đầu. Tuy nhiên, trên mỗi cặp bit tương ứng nhau của hai toán hạng, toán tử XOR sẽ trả về 1 nếu chỉ có một trong hai bit là 1 (và bit còn lại là 0), ngược lại, XOR trả về bit 0. Ví dụ: 0101XOR 0011 0110(cách nhớ dễ nhất là: 2 bit giống nhau trả về 0, 2 bit khác nhau trả về 1) Trong C, C++, Java, C#, toán tử thao tác bitXOR được biểu diễn bằng kí hiệu "^" (dấu mũ). Trong Pascal, toán tử này là "xor". Ví dụ:x = y ^ z; // CHay:x := y xor z; { Pascal }Câu lệnh trên sẽ gáp trình viên hợp ngữ (Assembly) thường sử dụng toán tử XOR để gán giá trị của một thanhghi (register) về 0. Khi thực hiện phép toán XOR cho một mẫu bit với chính bản thân nó, mẫu nhị phân nhận được sẽ toàn bit 0. Trên nhiều kiến trúc máy tính, sử dụng XOR để gán 0 cho một thanh ghi sẽ được CPU xử lí nhanh hơnso với chuỗi thao tác tương ứng để nạp và lưu giá trị 0 vào thanh ghi.[sửa]Dịch chuyển và quay bitPhép dịch bit được ký hiệu: >> (dịch phải) hoặc << (dịch trái)(trong c++) shl(dịch trái); shr(dịch phải) Ví dụ: 5 >> 1 =2(5 shr 1); 2 >> 1 = 1(2 shr 1); 1 >> 1 = 0;Giải thích: 5b = 0101 sau khi dịch 1 trở thành 0010 (=2d) và cứ tiếp tục như vậy.khi chuyển sang binary rồi thì cứ đặt phép tính như bt, sauđó thực hiện các qui tắc kiểu như:1 & 1 = 11& 0 =00&1=00&0=01|1=11|0=10|1=10|0=01^1=01^0=00^1=00^0=1 như ví dụ trên:00000010&00000100 00000000còn00000010|00000100 00000110__________________Các thao tác xử lý bit trong C/C++ 1 VoteĐề tài này sẽ cung cấp cho các bạn những kiến thức về việc sử dụng các phép toán logic từ đó giúp cho việc thiết kế các biểu thức logic dùng rất nhiêu trong các phép toán điều kiện được nhanh chóng, chính xác, hiệu quả.* Quy ươc về vị trí của các bit;Mỗi byte bao gồm 8 bit được mã số từ phải sang trái còn gọi là bit thấp đến bit cao. Bit nằm ở bên phải được xem làthấp hơn bit nằm ở bên trái. Các bit được đánh số như sau:7 6 5 4 3 2 1 0Mỗi bit có thể nhận 1 trong 2 giá trị là 0 hoặc 1. Tại mỗi thời điểm thực hiện chương trình mỗi bit đươc nhận giá trịxác định. Moi số nguyên trong máy đều biểu diễn dưới dạng nhị phân, thí dụ số 19 được biểu diễn như sau:Bit 7 6 5 4 3 2 1 0Giá trị 0 0 0 1 0 0 1 1 (số 19)* Các phép toán logicCác phép toán sau đây thực hiện trên các giá trị nguyên và cho kết quả là các giá trị nguyên.1. Phép đảo bit Not: đổi giá trị của mọi bit từ 0 thành 1 và ngược lại. Trong C phép đảo được kí hiệu là ~ .Ví dụ1 char x, y;2 x=19; //x=00010011//3 y=~x; //y=11101100(236)//2. Phép cộng logic trên các bit (OR) thực hiện trên từng cặp bit tương ứng của các toán hạng theo bảng cộng sau:1 a b a OR b2 0 0 03 0 1 14 1 0 15 1 1 1Quy tắc: Tổng hai bit bằng 0 khi và chỉ khi cả hai bit bằng 0 ngoài ra tổng nhận giá trị 1;Trong C phép OR được biểu diễn bằng kí hiệu ||Ví dụ1 char x, y, z;2 x= 19;//x=00010011//3 y= 21;//y=00010101//4 z= x||y;//z=00010111(23)//3. Phép nhân logic trên các bit AND: thực hiện trên từng cặp bit tương ứng của các toán hạng theo bảng nhân sau:1 a b a AND b2 0 0 03 0 1 04 1 0 05 1 1 1Quy tắc: Tích hai bit bằng 1 khi và chỉ khi cả hai bit bằng 1, ngoài ra tích nhận giá trị 0.Trong C phép AND được biểu diễn bằng kí hiệu &&Ví dụ1 char x, y, z;2 x=19;//x=00010011/3 y=21;//y=00010101//4 z=x AND y;//z=00010001(17)//4. Phép cộng loại trừ trên các bit (XOR) : thực hiện trên từng cặp bit tương ứng của các toán hạng theo bảng sau1 a b a XOR b2 0 0 03 0 1 14 1 0 15 1 1 0Quy tắc: tổng loại trừ của hai bit bằng 1 khi và chỉ khi hai bit đó chứa các giá trị khác nhau, ngoài ra tổng loại trừ nhận giá trị 0.Phép toán trên cũng còn được gọ là phép so sánh khác (khác nhau là đúng, bằng nhau là sai)Trong C không có phép toàn này. (Có bạn nào biết cách thể hiện phép XOR bằng phép AND và OR không ?)Ví dụ1 Ví dụ này chỉ là môt tả2 char x, y, x;3 x= 19;//x=00010011//4 y= 21;//y=00010101//5 Z=x XOR Y;//z=00000110(6)//5. Phép dịch trái (Shl): x Shl i cho gái trị nhận được từ số nguyên x sau khi dịch số đó qua trái i bit.Quy tắc: Muốn nhân 1 số với 2 ta dịch số đó qua trái 1 bit. Tổng quát, muốn nhân một sốnguyene với 2^i ta dịch số đó qua trái i bit;x Shl i= x*n; với n=2^iTrong C không hỗ trợ phép toán này nhưng có thể dùng phép chia nguyên cho 2^i để thực hiệnThí dụ1 Chỉ để minh họa2 {3 chả x, y;4 x=19;//x=00010011//5 y=x Shl 2;//y=01001100=x*4=76//6 }6. Phép dịch phải(Tương tự như phép dịch trái nhưng số nguyên sẽ được dịch sang phải i bit)MỘT SỐ ỨNG DỤNG*Ứng dụng 1(lấy bit). Viết hàm getbit(x,i) cho giá trị của bit thứ i(tính từ phải sang) của số nguyên x.1 char Getbit(char x, i)2 {3 return (x Shr i) && 1;4 }*Ứng dụng 2(lấy số) Viết hàm GetNum(x, j, i) cho số tạo bởi các bit tính từ trái qua phải là bit thứ j đến bit thứ i (j>=i). Thí dụGetNum(103,5,1)=19 vì 103=0000 0000 0110 0111do dó GetNum(103,5,1)= 0000 0000 0001 0011 =19Bài giải: Gọi số lượng bit của x là L(x) , trước hết ta phải hóa 0 các bit nằm ở bên trái bit thứ j. Muốn vậy ta dịch x qua trái k= L(x)-1-j bit. Sau đó ta chuyển giá trị thu được về cấu hình ban đầu tức là dịch phải k bit rồi tiếp tục dịch phải i bit để thu được số cần tìm. Hàm sizeof(x) cho ta số byte trong x. Nhân giá trị này với 8 ta sẽ được số bit trong x. Vì phép nhân 8 tương đuơng với phép dịch trái 3 bit nên sizeof(x) Shl 3 cho ta số bit trong x. Vì các bit được mã số từ phải sang trái bắt đầu từ bit 0 cho nên số hiệu cao nhất trong x sẽ là sizeof(x) Shl 3 -11 char Getnum(char x, j, i)2 {3 char k;4 k= (sizeof(x) Shl 3)-1-j5 return x Shl k Shr k Shr i;6 }Đối với 2 hàm Getbit và GetNum ở trên ta sé có được mộtsố ứng dụng như chuyển từ số tự nhiên sang biểu diễn nhị phân, thập lục phân, bát phân.Ngoài ra dựa vào các phép toán logic cơ bản này ta có thể có một số ứng dụng khác như:-viết hàm biểu diễn dưới dạng nhị phân mà không có số 0 thừa ở đầu-Viết hàm đảo trật tự các bit trong 1 số ví dụ: 1011 (11) tahnhf 1101(13)(Bài tiếp theo: Cách bật tắt các bit trong một số nguyên)5. Phép dịch trái (Shl): x Shl i cho gái trị nhận được từ số nguyên x sau khi dịch số đó qua trái i bit.Quy tắc: Muốn nhân 1 số với 2 ta dịch số đó qua trái 1 bit. Tổng quát, muốn nhân một sốnguyene với 2^i ta dịch số đó qua trái i bit;x Shl i= x*n; với n=2^iTrong C không hỗ trợ phép toán này nhưng có thể dùng phép chia nguyên cho 2^i để thực hiệnThí dụ1 </div>2 <div id="cviet_code_902">Chỉ để minh họa3 {4 chả x,5 x=19;//x=00010011//6 y=x Shl 2;//y=01001100=x*4=76//7896. Phép dịch phải(Tương tự như phép dịch trái nhưng số nguyên sẽ được dịch sang phải i bit)MỘT SỐ ỨNG DỤNG*Ứng dụng 1(lấy bit). Viết hàm getbit(x,i) cho giá trị của bit thứ i(tính từ phải sang) của số nguyên x.1 </div>2 <div id="cviet_code_399">char Getbit(char x, i)3 {4 return (x Shr i) && 1;56*Ứng dụng 2(lấy số) Viết hàm GetNum(x, j, i) cho số tạo bởi các bit tính từ trái qua phải là bit thứ j đến bit thứ i (j>=i). Thí dụGetNum(103,5,1)=19 vì 103=0000 0000 0110 0111do dó GetNum(103,5,1)= 0000 0000 0001 0011 =19Bài giải: Gọi số lượng bit của x là L(x) , trước hết ta phải hóa 0 các bit nằm ở bên trái bit thứ j. Muốn vậy ta dịch x qua trái k= L(x)-1-j bit. Sau đó ta chuyển giá trị thu được về cấu hình ban đầu tức là dịch phải k bit rồi tiếp tục dịch phải i bit để thu được số cần tìm. Hàm sizeof(x) cho ta số byte trong x. Nhân giá trị này với 8 ta sẽ được số bit trong x. Vì phép nhân 8 tương đuơng với phép dịch trái 3 bit nên sizeof(x) Shl 3 cho ta số bit trong x. Vì các bit được mã số từ phải sang trái bắt đầu từ bit 0 cho nên số hiệu cao nhất trong x sẽ là sizeof(x) Shl 3 -11 </div>2 <div id="cviet_code_1302">char Getnum(char x, j, i)345 k= (sizeof(x) Shl 3)-1-j6 return x Shl k Shr k Shr i;78Đối với 2 hàm Getbit và GetNum ở trên ta sé có được mộtsố ứng dụng như chuyển từ số tự nhiên sang biểu diễn nhị phân, thập lục phân, bát phân.Ngoài ra dựa vào các phép toán logic cơ bản này ta có thể có một số ứng dụng khác như:-viết hàm biểu diễn dưới dạng nhị phân mà không có số 0 thừa ở đầu-Viết hàm đảo trật tự các bit trong 1 số ví dụ: 1011 (11) tahnhf 1101(13)* Thủ tục Batbit(x,i) gán trị 1 cho bit thứ i trong byte xMô tả: Ta chuyển 1 đến vị trí i tương ứng sau đó thực hiệnphép cộng logic với byte x1 </div>2 <div id="cviet_code_510">Ví dụ này chỉ mang tính minh họa3 char Batbit(char x, i)4 {5 return x OR(1 Shl i);6 }</div>7* Thu tục Tatbit(x, i) gán trị 0 cho bit thứ i trong byteMô tả: Ta chuyển 1 đến vị trí i tương ứng, sau đó đảo bytenày để được byte có 0 ở vị trí i và 1 ở các bit còn lại, cuối cùng thực hiện phép nhân logic với byte x.1 </div>2 <div id="cviet_code_1238">Ví dụ này chỉ mang tính minh họa3 Char Tatbit(char x, i)4 {5 return NOT(1 Shl i) And x;6 }</div>7Bạn hailoc12 đã có công viết 1 bài dài về thao tác bit => xin ủng hộ 100%Xin được góp ý vô 1 chút. Về NOT, AND, OR, XOR thì C có 2 loại: thao tác logic và thao tác bitThao tác logic: giá trị bằng 0 được coi như là false (sai); giá trị khác 0 được coi như là true (đúng). Các toán tử là ‘!’(NOT), ‘&&’ (AND), và ‘||’ (OR) (không có toán tử XOR logic; nhưng có thể viết bằng NOT, AND, OR)Thao tác bit: bit 0 được coi như là false (sai); bit 1 được coi như là true (đúng). Các toán tử là ‘~’ (NOT), ‘&’ (AND), ‘|’ (OR) va` ‘^’ (XOR)Về phép dịch bit: các toán tử là ‘>>’ (dịch qua phải) và ‘<<’ (dịch qua trái) (tương ứng với phép dịch cho số không dấutrong hợp ngữ; C không có toán tử dịch qua phải có dấu)Về bật / tắt / đảo bit:X AND 0 -> 0; X AND 1 -> X: dùng để tắt bitX OR 0 -> X; X OR 1 -> 1: dùng để bật bitX XOR 0 -> X; X XOR 1 -> ~X: dùng để đảo bitNguồn : />t=3164./ Toán tử dịch phải:- Ký hiệu: >>- Toán tử này làm việc trên một biến duy nhất và dịch từng bit trong toán hạng sang phải. Số bit dịch chuyển được chỉ định trong số đi theo sau toán tử. Việc dịch phải n bit đồng nghĩa với việc chia toán hạng cho 2^n. Giá trị của bit chèn vào bên trái luôn luôn bằng 0. - Ví dụ: 23>>1 (dịch 23 sang phải 1 bit)Khi đó kết quả sẽ ra bằng 11 (00001101).Để kiếm tra lại, ta thực hiện phép toán 23 chia 2^1, cũng sẽ cho ra kết quả bằng 11.5./ Toán tử dịch trái:- Ký hiệu: <<- Tương đương với toán tử dịch phải. Giá trị của bit chèn vào bên phải luôn luôn bằng 0. Dịch một số sang trái n bit tương đương với việc nhân số đó với 2^n- Ví dụ: 23<<1 (dịch 23 sang trái 1 bit)Khi đó kết quả sẽ ra bằng 46 (00101110).Để kiểm tra lại, ta thực hiện phép toán 23 nhân 2^1, cũng sẽ cho ra kết quả bằng 46.6./ Toán tử đảo bit:- Ký hiệu: ~- Toán tử này là toán tử một ngôi. Nó tác động đến bit của toán hạng và đảo trị của bit từ 1 sang 0 và từ 0 sang 1. Đảo hai lần một số ta lại nhận được số cũ.
Tài liệu liên quan
- Tìm hiểu Một số phần mềm Kế toán đang được sử dụng tại Việt Nam
- 39
- 870
- 3
- 207 Tìm hiểu Một số phần mềm Kế toán đang được sử dụng tại Việt Nam
- 39
- 742
- 0
- Một số phương tiện giao dịch thanh toán điện tử được sử dụng trong ngân hàng điện tử
- 46
- 710
- 0
- Tài liệu Các giao thức được sử dụng trong hệ thống Mail pptx
- 6
- 576
- 2
- Tài liệu Các phép lai được sử dụng để tìm ra các định luật di truyền pptx
- 25
- 452
- 4
- MỘT số CHỨNG từ được sử DỤNG TRONG CÔNG tác HẠCH TOÁN CHI PHÍ
- 82
- 638
- 0
- Nghiên cứu ứng dụng xỉ thải pyrit của công ty supe phốt phát và hóa chất lâm thao làm vật liệu xử lý asen và mangan trong nước ngầm sử dụng làm nước sinh hoạt
- 21
- 620
- 0
- Các giao thức được sử dụng trong hệ thống Mail potx
- 7
- 364
- 0
- Báo cáo "Các loại cáp được sử dụng phổ biến trong viễn thông" docx
- 24
- 577
- 0
- CÁC PHÉP LAI ĐƯỢC SỬ DỤNG ĐỂ TÌM RA CÁC ĐỊNH LUẬT DI TRUYỀN docx
- 20
- 985
- 8
Tài liệu bạn tìm kiếm đã sẵn sàng tải về
(53.97 KB - 17 trang) - Các toán tử thao tác bit Tải bản đầy đủ ngay ×Từ khóa » Toán Tử Dịch Bit Trong C
-
Các Thao Tác Trên Bit — Modern C++ - STDIO
-
Phép Toán Thao Tác Bit Trong C++ (Bitwise Operation)
-
Tự Học C/C++ | Toán Tử Bitwise »
-
Hỏi Về Phép Dịch Phải Dịch Trái Trong C/c++ - Programming
-
Phép Toán Thao Tác Bit – Wikipedia Tiếng Việt
-
C - Bài 08B: Toán Tử Thao Tác Trên Bit - YouTube
-
Chương 11: Phép Thao Tác Trên Các Số Nhị Phân
-
Toán Tử So Sánh Bit Trong C | 64 Bài Học Lập Trình C Hay Nhất
-
Toán Tử Logic, Toán Tử Trên Bit Và Toán Tử Gán Trong C++ - Góc Học IT
-
Toán Tử Bitwise - Viblo
-
Fun With Bits - VNOI
-
BIT MATH – Các Phép Toán Thao Tác Trên Bit
-
Các Thao Tác Xử Lý Bit Trong C/C++ | Sk4eo
-
Phép Toán Thao Tác Bit - Wiki Là Gì
-
Toán Tử Trong C - VietTuts
-
Các Toán Tử Bitwise - Openplanning
-
Phép Toán Thao Tác Bit - VOER - Thư Viện Học Liệu Mở Việt Nam
-
Toán Tử Trong C - AICurious