|
|
c m s c 311
s u m m e r 2 0 0 3 |
Answer:
void setBit( unsigned int & num, int index ) ;You may assume the index is between 0 and 31 inclusive. As usual, index 0 is the least significant bit (LSb), while index 31 is the most significant bit.
Answer:
void setBit( unsigned int & num, int index ) {
unsigned int bitMask = 1 ; // Set LSb to 1
bitMask <<= index ; // Set bitindex to 1, by shifting
num |= bitMask ; // OR in correct value
}
void clearBit( unsigned int & num, int index ) ;You may assume the index is between 0 and 31 inclusive. As usual, index 0 is the least significant bit (LSb), while index 31 is the most significant bit.
Answer:
void clearBit( unsigned int & num, int index ) {
unsigned int bitMask = 1 ;
bitMask <<= index ;
bitMask = ~bitMask ; // Flip bits
num &= bitMask ; // AND in the correct bit
}
Here's the prototype:
bool anyOnes( unsigned int & num, int low, int high ) ;
Answer:
bool anyOnes( unsigned int & num, int low, int high ) {
int numOnes = ( high - low ) + 1 ;
unsigned int bitMask = ~0 ; // Flip 0 to get all 1's
bitMask <<= numOnes ; // Now create numOnes zeroes at the end
bitMask = ~bitMask ; // Flip bits to numOnes 1's
bitMask <<= low ; // Shift low bits to left
return num & bitMask ; // true, if num & bitMask is non-zero
}
Here's the prototype:
bool selectRange( unsigned int & num, int low, int high ) {
Answer:
bool selectRange( unsigned int &num, int low, int high ) {
int numOnes = ( high - low ) + 1;
unsigned int bitMask = ~0 ; // Flip 0 to get all 1's
bitMask <<= numOnes ; // Now create numOnes zeroes at the end
bitMask = ~bitMask ; // Flip bits to numOnes 1's
bitMask <<= i ; // Shift low bits to left
return num &= bitMask ; // true, if num &= bitMask is non-zero
}
Answer:
void swap( unsigned int &num1, unsigned int &num2 ) {
num1 = num1 ^ num2; // num1 holds num1' XOR num2'
num2 = num1 ^ num2; // num2 holds num1' XOR num2' XOR num2' == num1'
num1 = num2 ^ num1; // num1 holds num1' XOR num1' XOR num2' == num2'
}
Let num1' be the original value of num1, at the time
it was passed in. Let num2' be the original value of
num1, at the time it was passed in.
Answer:
void arithmeticRightShift( unsigned int & num, int shiftAmt ) {
unsigned int bitMask = 1;
bitMask <<= 31 ; // assume 32 bits--puts 1 at MSb
if ( bitMask & num ) // is num negative?
{
bitMask = ~0 ; // make all 1's by negating 0
bitMask << ;= ( 32 - shiftAmt );
num >>= shiftAmt; // Shift right
num |= bitMask; // Put 1's in upper shiftAmt bits of num
}
else // num is non-negative
num >>= shiftAmt; // use regular logical shifting
}