posted Sep 23, 2009, 3:39 PM by Likai Liu
 Review
 Bitwise operators &  ~ treat an integer as a vector of bits.
 Logical (boolean) operators &&  ! treat nonzero integer as true, and zero integer as false.
 Practice problem 2.13, use gdb commands as a simple command line calculator.
 set var $x = 0x66 /* sets gdb pseudo variable $x to value 0x66 */
 set var $y = 0x93 /* sets gdb pseudo variable $y to value 0x93 */
 p /x $x & $y /* prints the result of 0x66 & 0x93 in hexadecimal */
 ....
 Practice problem 2.14, write x == y without using == operator (see eq.c attached).
 If we see x and y as bit sets, x & ~y is the set difference x  y, and y & ~x is the set difference y  x. If x ⊆ y, then x  y = ∅. Likewise, if y ⊆ x, then y  x = ∅. If x ⊆ y and y ⊆ x, then x = y. So the expression !(x & ~y) && !(y & ~x) works.
 Using XOR, x ^ x = 0 and x ^ y != 0 if x != y. So the expression !(x ^ y) also works.
 Practice problem 2.23, pass gcc flags Wall Wextra to tell gcc to report many common mistakes. In particular, the warning for this particular problem is Wsigncompare.
 Big endian vs. little endian machines (see endian.c attached).
 int i = 0x44332211, on little endian the bytes are stored in memory as 11 22 33 44. On big endian, the bytes are stored as 44 33 22 11.
 On both 32bit and 64bit machines, sizeof(int) is 4 bytes (32bits). However, sizeof(long int) is 4 bytes (32bits) on 32bit machine and 8 bytes (64bits) on 64bit machine.
 On little endian 64bit machine, long int i = 0x44332211 is stored in memory as 11 22 33 44 00 00 00 00.

Updating...
Likai Liu, Sep 23, 2009, 3:59 PM
