CSC 2400: Computer Systems Bit-Level vs. Logical Operators
Review – Addition q 2’s complement addition is just binary addition - assume all integers have the same number of bits - for now, assume no overflow 01101000 (104) 11110110 (-10) + 11110000 (-16) + (-9) 01011000 (88) (-19) Assume 8-bit 2’s complement numbers.
Review – Sign Extension q To add two numbers, we must represent them with the same number of bits. q If we just pad with zeroes on the left NOT GOOD! ) : 4-bit 8-bit 0100 (4) 00000100 (still 4) 1100 (-4) 00001100 ( 12, not -4; NOT GOOD! ) q Instead, replicate the sign bit to the left: 4-bit 8-bit 0100 (4) 00000100 (still 4) 1100 (-4) 11111100 (still -4)
Review – Memory and Variables char c = ‘A’; 01000001 char c = 65; 01000001 char c = 0x41; 01000001 int i = 258; 00000000 00000000 00000001 00000010 int i = 0x102; 00000000 00000000 00000001 00000010 int j = 0xF0A2; 00000000 00000000 11110000 10010010
Bit-Level Operators Common to C and Java &, |, ~, ^, <<, >>
Bitwise Operators ~ Bitwise NOT “ flips ” bits & Bitwise AND 1 if both operands are 1 | Bitwise OR 0 if both operands are 0 ^ Bitwise XOR 0 if operands are equal << Bitwise Left Shift shifts bits to the left >> Bitwise Right Shift shifts bits to the right • Apply to any “integral” data type: long , int , short , char • View arguments as bit vectors • Arguments applied bit-wise
Bitwise Operators ~ A A B A&B A|B A^B A^A 0 0 0 1 1 0 1 1
NOT (~) Example Input 1 0 1 1 0 1 0 0 0xB4 ~Input 0x___
AND (&) and OR (I) and XOR (^) Examples A 1 0 1 1 0 1 0 0 0xB4 B 0 1 1 0 1 0 1 1 0x___ A & B 0x___ A | B 0x___ A ^ B 0x___ A ^ A 0x___
AND (&) and OR (I) and XOR (^) Examples 0x69 & 0x55 --> 0x______ 0x69 | 0x55 --> 0x______ 0x69 ^ 0x55 --> 0x______
Bitmasks q Used to change or query one or more bits in a variable q The bitmask indicates which bits are to be affected q Common operations: - Setting one or more bits to 1 - Setting one or more bits to 0 - Reading one or more bits
Bitmasks – set single bit to 1 q Assume that data is an integer variable (size is unknown) q Set the least significant bit of data to 1 (other bits are unchanged) data 1 0 1 1 0 1 0 ? mask result wanted 1 0 1 1 0 1 0 1 q C statement: data | 1 data = _______________________;
Bitmasks – set multiple bits to 1 q Assume that data is an integer variable (size is unknown) q Set bit 0, 2 and 3 of data to 1 (leave the other bits unchanged): data 1 0 1 1 ? ? 0 ? mask result wanted 1 0 1 1 1 1 0 1 q C statement: data | 0xD data = _______________________;
Bitmasks – set byte to 0xFF q Assume that data is an integer variable (size is unknown) q Set the least significant byte of data to 0xFF data 1 0 1 1 0 0 0 1 ? ? ? ? ? ? ? ? mask result wanted 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 q C statement: data | 0xFF data = _______________________;
Bitmasks – set another byte to 0xFF q Assume that data is an integer variable (size is unknown) q Set the 2 nd least significant byte of data to 0xFF data ? ? ? ? ? ? ? ? 1 0 1 1 0 0 0 1 mask result wanted 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 q C statement: data | 0xFF00 data = _______________________;
Bitmasks – clear (set to 0) single bit q Assume that data is an integer variable (size is unknown) q Set the least significant bit of data to 0: data 1 0 1 1 0 1 1 ? mask result wanted 1 0 1 1 0 1 1 0 q C statement: data & ~1 data = _______________________;
Review – Common Bit Operations q Set one or more bits to 1 q Set one or more bits to 0 q Read one or more bits
Review – What Does This Code Do? int data = ...; data = data | 0x1; data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 0x1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 result ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1 q Answer: - Set the least significant bit to 1
Review – What Does This Code Do? int data = ...; data = data | 0x4; data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 0x4 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 result ? ? ? ? ? ? ? ? ? ? ? ? ? 1 ? ? bit 2 bit 1 bit 0 q Answer: - Set bit 2 (third least significant bit) to 1
Review – What Does This Code Do? int data = ...; data = data | 0xF; data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 0xF 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 result ? ? ? ? ? ? ? ? ? ? ? ? 1 1 1 1 bit 3 bit 2 bit 1 bit 0 q Answer: - Set the four least significant bits to 1
Review – What Does This Code Do? int data = ...; data = data & ~0x1; data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? & ~0x1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 result ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0 bit 0 q Answer: - Clear the least significant bit (set it to 0)
Bitmasks – clear (set to 0) multiple bits q Assume that data is an integer variable (size is unknown) q Clear (set to 0) bits 0, 2 and 4 of data (other bits are unchanged): data 1 0 1 ? 0 ? 1 ? mask result wanted 1 0 1 0 0 0 1 0 q C statement: data & ~0x15 data = _______________________;
Bitmasks – clear (set to 0) single byte q Assume that data is an integer variable (size is unknown) q Clear (set to 0) the least significant byte of data data 1 0 1 1 0 0 0 1 ? ? ? ? ? ? ? ? mask result wanted 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 q C statement: data & ~0xFF data = _______________________;
Feedback Results q Review Topics (Today) q Ungraded Practice Quizzes (1/week) q Review Homework q More Hands-on/Labs/C Programming (Coming Up) q Teaching - Slow Down - Explain Jargon - Step-by-step Examples q When post slides?
Bitmasks – clear (set to 0) multiple bytes q Assume that data is an integer variable (size is unknown) q Clear (set to 0) bytes 0 and 1 of data data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mask result wanted 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 q C statement: data & ~0xFFFF data = _______________________;
Bitmasks – read bit q Assume that data is an integer variable (size is unknown) q Determine the least significant bit of data: data 1 0 1 1 0 1 0 ? mask result wanted 0 0 0 0 0 0 0 ? q C statement: data & 1 result = _______________________;
Bitmasks – read another bit q Assume that data is an integer variable (size is unknown) q Determine the 2 nd least significant bit of data: data 1 0 1 1 0 1 ? 1 mask result wanted 0 0 0 0 0 0 0 ? q Need to shift
Bitwise Operator: Left Shift << q Left shift: A << n (same as multiply by 2 n ) - Shift the bit-vector A to the left by n bits - Leftmost n bits are lost; rightmost n bits become 0 A 1 0 1 1 0 1 0 0 0xB4 A << 3 1 0 1 0 0 0 0 0 0x___
Bitwise Operator: Right Shift >> q Right shift: A >> n (same as divide by 2 n ) - Shift the bit-vector A to the right by n bits - Rightmost n bits are lost; what about leftmost n bits? char A; 1 0 1 1 0 1 0 0 0xB4 A >> 3 1 1 1 1 0 1 1 0 0x___ char A; 0 0 1 1 0 1 0 0 0x34 A >> 3 0 0 0 0 0 1 1 0 0x___ q Uses sign extension for signed types
Bitwise Operator: Right Shift >> unsigned char A; 1 0 1 1 0 1 0 0 0xB4 A >> 3 0 0 0 1 0 1 1 0 0x___ unsigned char A; 0 0 1 1 0 1 0 0 0x34 A >> 3 0 0 0 0 0 1 1 0 0x___ q Insert 0 to the left for unsigned types Note: Java has the unsigned shift operator >>> (not available in C)
Bitmasks – revisit example q Determine the 2 nd least significant bit of data (size unknown): data 1 0 1 1 0 1 ? 1 data >> 1 ? mask result wanted 0 0 0 0 0 0 0 ? q C statement: (data >> 1) & 1 result = _______________________;
Bitmasks – read another bit q Determine the 4 th least significant bit of data (size unknown): data 1 0 1 ? 0 1 0 1 result 0 0 0 0 0 0 0 ? q C statement: (data >> 4) & 1 result = _______________________;
Bitmasks – read byte q Assume that data is an integer variable (size is unknown) q Determine the 2 nd least significant byte of data data ? ? ? ? ? ? ? ? 1 0 1 1 0 1 0 1 result 0 0 0 0 0 0 0 0 ? ? ? ? ? ? ? ? q C statement: (data >> 8) & 0xFF result = _______________________;
Bitwise Operators q Write code to print all the bits of a character from left to right (starting with the most significant bit): 1 0 1 1 0 1 0 1 char c = 0xB5; void print_binary(char c) { /* add code here */ }
Relations Between Operations q DeMorgan’s Laws - Express & in terms of |, and vice-versa o A & B = ~(~A | ~B) • A and B are true if and only if neither A nor B is false o A | B = ~(~A & ~B) • A or B are true if and only if A and B are not both false q Exclusive-Or using Inclusive Or o A ^ B = (~A & B) | (A & ~B) • Exactly one of A and B is true o A ^ B = (A | B) & ~(A & B) • Either A is true, or B is true, but not both
Why Bitwise Operators?
Used in Networking
Used in Encryption/ Decryption
Recommend
More recommend