Download Presentation
## Bits and Bytes

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -

**Recall boolean logical operators in Java…**• boolean logical operators: &, |, ^ • not: ! Show truth tables.**Recall boolean logical operators in Java…**• boolean logical operators: &, |, ^ • not: ! Also conditional operators: &&, || • Difference between & and &&. • Differences between | and ||. • How can we demonstrate this?**Bitwise integer operators**• HLL such as Java and C/C++ support many bitwise integer operators. • Java: • bitwise: &, ^, |, -, ~ • shift: <<, >>, >>> (Note: C/C++ supports all of the above except >>>.)**Bitwise integer operators**• Note: In Java and C/C++ as in Assembler, the bitwise operators can be applied to any of the integer data types (char, short, int, and long). • Note: All of the following examples employ 8-bit (byte) or 16-bit (short) integers but the ideas can and are extended to other integer data sizes. • Note: All of the following examples represent numbers in hex and binary for convenience. These rules apply to decimal numbers as well.**~ (1’s complement)**• Given 0x3a, what is ~0x3a? • Given 0x0022, what is ~0x0022?**- (2’s complement)**• Given 0x3a, what is -0x3a? • Given 0x0022, what is -0x0022?**Shift operators**• Left shift: A << B • Signed right shift: A >> B (sign extension) • Unsigned right shift: A >>> B (zero extension) A = value to be shifted B = shift distance**Shift operators**Left shift: A << B**Shift operators**Signed right shift: A >> B (sign extension)**Shift operators**Unsigned right shift: A >>> B (zero extension)**Examples**10 << 1 7 << 3 -1 << 2**Examples**10 << 1 20 7 << 3 56 -1 << 2 -4**Examples**10 >> 1 27 >> 3 -50 >> 2**Examples**10 >> 1 5 0000 1010 >> 1 = 0000 0101 27 >> 3 3 0001 1011 >> 3 = 0000 0011 -50 >> 2 -13 1100 1110 >> 2 = 1111 0011 What is 1111 0011? 0000 1100 + 1 = 0000 1101 = 13 So 1111 0011 = -13 Preserves sign.**Examples**-50 >>> 2 0xff >>> 4**Examples**-50 >>> 2 51 1100 1110 >>> 2 = 0011 0011 0xff >>> 4 15 1111 1111 >>> 4 = 0000 1111 Does not preserve sign.**Examples**byte b = ~12; flags = flags & ~0xf; 10 & 7 if ((flags & 0xf) != 0)**Examples**10 | 7 flags = flags | 0xf; flags |= 0xa; 10 ^ 7 ~0x97**Examples**int bits = 1; bits = bits << 1; bits = bits << 2; bits = bits >> 3;**Examples**int b1 = 0x65; int b2 = 0xaf; int x = b1 & b2; int y = b1 ^ b2; int z = b1 | b2;**Problem 1**• How can we determine if an int is odd or even?**Problem 2**• Using bitwise operators, write a program in Java that converts an int from its current endian-ness to the other.**Problem 3**• Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // What does this indicate? // How do I indicate that student #7 took the quiz?**Problem 3**• Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // indicate that no one took the quiz quiz1 |= 1 << 7; // indicate that student #7 took the quiz // How do I indicate that student #4 took the quiz?**Problem 3**• Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // indicate that no one took the quiz quiz1 |= 1 << 7; // indicate that student #7 took the quiz quiz1 |= 1 << 4; // indicate that student #4 took the quiz // Oops! Student #7 didn’t take the quiz. Turn it off.**Problem 3**• Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // indicate that no one took the quiz quiz1 |= 1 << 7; // indicate that student #7 took the quiz quiz1 |= 1 << 4; // indicate that student #4 took the quiz quiz1 &= ~(1 << 7); // Oops! Student #7 didn’t take the quiz. Turn it off.**Problem 3**Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // indicate that no one took the quiz quiz1 |= 1 << 7; // indicate that student #7 took the quiz quiz1 |= 1 << 4; // indicate that student #4 took the quiz quiz1 &= ~(1 << 7); // Oops! Student #7 didn’t take the quiz. Turn it off. int quiz2 = 0; // let’s give another quiz! … // indicate students that took quiz 2 // How can we determine if student #4 took both?**Problem 3**Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // indicate that no one took the quiz quiz1 |= 1 << 7; // indicate that student #7 took the quiz quiz1 |= 1 << 4; // indicate that student #4 took the quiz quiz1 &= ~(1 << 7); // Oops! Student #7 didn’t take the quiz. Turn it off. int quiz2 = 0; // let’s give another quiz! … // indicate students that took quiz 2 // determine if student #4 took both final int s7 = 1<<7; if ( (quiz1&s7) != 0 && (quiz2&s7) != 0 ) { … //student 7 took both }**Problem 3**Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // indicate that no one took the quiz quiz1 |= 1 << 7; // indicate that student #7 took the quiz quiz1 |= 1 << 4; // indicate that student #4 took the quiz quiz1 &= ~(1 << 7); // Oops! Student #7 didn’t take the quiz. Turn it off. int quiz2 = 0; // let’s give another quiz! … // indicate students that took quiz 2 // How can we print out all students that took either quiz 1 or quiz 2 // (but not both)?**Problem 3**Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // indicate that no one took the quiz quiz1 |= 1 << 7; // indicate that student #7 took the quiz quiz1 |= 1 << 4; // indicate that student #4 took the quiz quiz1 &= ~(1 << 7); // Oops! Student #7 didn’t take the quiz. Turn it off. int quiz2 = 0; // let’s give another quiz! … // indicate students that took quiz 2 // determine whether a student took either quiz 1 or quiz 2 (but not both) int oneOrTheOther = quiz1 ^ quiz2; // How do we print the students out?**Problem 3**Say class sizes are limited to 32 students. Therefore, I can use the bits in an int to indicate whether or not students took a particular quiz: int quiz1 = 0; // indicate that no one took the quiz quiz1 |= 1 << 7; // indicate that student #7 took the quiz quiz1 |= 1 << 4; // indicate that student #4 took the quiz quiz1 &= ~(1 << 7); // Oops! Student #7 didn’t take the quiz. Turn it off. int quiz2 = 0; // let’s give another quiz! … // indicate students that took quiz 2 // determine whether a student took either quiz 1 or quiz 2 (but not both) int oneOrTheOther = quiz1 ^ quiz2; // print out the students if ( (oneOrTheOther & 1) != 0 ) System.out.println( “one” ); oneOrTheOther >>>= oneOrTheOther; if ( (oneOrTheOther & 1) != 0 ) System.out.println( “two” ); …**AND**• Operation: DEST ← DEST AND SRC; • Flags Affected: • The OF and CF flags are cleared. • the SF, ZF, and PF flags are set according to the result. • The state of the AF flag is undefined.**NEG (2’s)**• Operation: IF DEST = 0 THEN CF ← 0 ELSE CF ← 1; FI; DEST ← – (DEST) • Flags Affected: • The CF flag set to 0 if the source operand is 0; otherwise it is set to 1. • The OF, SF, ZF, AF, and PF flags are set according to the result.