 Download Download Presentation Bits and Bytes

# Bits and Bytes

Download Presentation ## Bits and Bytes

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
##### Presentation Transcript

1. Bits and Bytes

2. bitwise operators

3. Recall boolean logical operators in Java… • boolean logical operators: &, |, ^ • not: ! Show truth tables.

4. Recall boolean logical operators in Java… • boolean logical operators: &, |, ^ • not: ! Also conditional operators: &&, || • Difference between & and &&. • Differences between | and ||. • How can we demonstrate this?

5. recall bitwise (INTEGER) operators

6. 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 >>>.)

7. 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.

8. Bitwise & (and)

9. Bitwise & (and)

10. Bitwise & (and)

11. Bitwise & (and)

12. Bitwise & (and)

13. Bitwise & (and)

14. Bitwise | (or)

15. Bitwise | (or)

16. Bitwise ^ (xor)

17. Bitwise ^ (xor)

18. ~ (1’s complement) • Given 0x3a, what is ~0x3a? • Given 0x0022, what is ~0x0022?

19. - (2’s complement) • Given 0x3a, what is -0x3a? • Given 0x0022, what is -0x0022?

20. 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

21. Shift operators Left shift: A << B

22. Shift operators Signed right shift: A >> B (sign extension)

23. Shift operators Unsigned right shift: A >>> B (zero extension)

24. Examples 10 << 1 7 << 3 -1 << 2

25. Examples 10 << 1 20 7 << 3 56 -1 << 2 -4

26. Examples 10 >> 1 27 >> 3 -50 >> 2

27. 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.

28. Examples -50 >>> 2 0xff >>> 4

29. Examples -50 >>> 2 51 1100 1110 >>> 2 = 0011 0011 0xff >>> 4 15 1111 1111 >>> 4 = 0000 1111 Does not preserve sign.

30. Examples byte b = ~12; flags = flags & ~0xf; 10 & 7 if ((flags & 0xf) != 0)

31. Examples 10 | 7 flags = flags | 0xf; flags |= 0xa; 10 ^ 7 ~0x97

32. Examples int bits = 1; bits = bits << 1; bits = bits << 2; bits = bits >> 3;

33. Examples int b1 = 0x65; int b2 = 0xaf; int x = b1 & b2; int y = b1 ^ b2; int z = b1 | b2;

34. Problem 1 • How can we determine if an int is odd or even?

35. Problem 2 • Using bitwise operators, write a program in Java that converts an int from its current endian-ness to the other.

36. 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?

37. 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?

38. 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.

39. 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.

40. 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?

41. 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 }

42. 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)?

43. 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?

44. 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” ); …

45. End recall

46. IA32 Bitwise logical instructions

47. AND

48. 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.

49. NEG

50. 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.