Problem
Given two 32-bits numbers, n and m, and two bit positions, i and j. Write a method to set all bits between i and j in n equal to m
Solution
/*
============================================================================
Author : James Chen
Email : a.james.chen@gmail.com
Description : Write a method to set all bits between i and j in n equal to m
Created Date :
Last Modified : 3-July-2013
============================================================================
*/
#include <iostream>
#include <iomanip>
#include <limits>
#include <cassert>
using namespace std;
// start, end(not inclusive)
static unsigned int BitSet(unsigned int num, unsigned int mask, int start, int end)
{
assert(start >= 0);
assert(end <= 32);
assert(start < end);
unsigned int mask1 = numeric_limits<unsigned int>::max();
if (start != 0)
{
mask1 >>= (start - 1);
mask1 <<= (start - 1);
}
unsigned int mask2 = numeric_limits<unsigned int>::max();
mask2 <<= (sizeof(unsigned int) * 8 - end);
mask2 >>= (sizeof(unsigned int) * 8 - end);
mask2 &= mask1;
return (mask2 & mask) | (~mask2 & num);
return true;
}
static void DoTest(unsigned int num, unsigned int mask, int start, int end)
{
cout << "num = " << hex << setw(8) << num;
cout << " mask = " << hex << setw(8) << mask;
cout << " start = " << dec << start;
cout << " end = " << dec << end << endl;
char buffer[100];
itoa(num, buffer, 2);
cout << setw(32) << buffer << "-- num " << endl;
itoa(mask, buffer, 2);
cout << setw(32) << buffer << "-- num " << endl;
itoa(BitSet(num, mask, start, end), buffer, 2);
cout << setw(32) << buffer << "-- num " << endl;
cout << "-----------------------" << endl;
}
int main(int argc, char* argv[])
{
for (int i = 31; i >= 0; --i)
{
if (i % 10 == 0)
{
cout << i / 10;
}
else
{
cout << " ";
}
}
cout << endl;
for (int i = 31; i >= 0; --i)
{
cout << i % 10;
}
cout << endl;
DoTest(0xa5a5a5a5, 0xb2b2b2b2, 0, 10);
DoTest(0xa5a5a5a5, 0xb2b2b2b2, 10, 20);
DoTest(0xa5a5a5a5, 0xb2b2b2b2, 20, 30);
DoTest(0xa5a5a5a5, 0xb2b2b2b2, 0, 31);
DoTest(0xa5a5a5a5, 0xb2b2b2b2, 0, 32);
return 0;
}
Output
3 2 1 0
10987654321098765432109876543210
num = a5a5a5a5 mask = b2b2b2b2 start = 0 end = 10
10100101101001011010010110100101-- num
10110010101100101011001010110010-- num
10100101101001011010011010110010-- num
-----------------------
num = a5a5a5a5 mask = b2b2b2b2 start = 10 end = 20
10100101101001011010010110100101-- num
10110010101100101011001010110010-- num
10100101101000101011001110100101-- num
-----------------------
num = a5a5a5a5 mask = b2b2b2b2 start = 20 end = 30
10100101101001011010010110100101-- num
10110010101100101011001010110010-- num
10110010101101011010010110100101-- num
-----------------------
num = a5a5a5a5 mask = b2b2b2b2 start = 0 end = 31
10100101101001011010010110100101-- num
10110010101100101011001010110010-- num
10110010101100101011001010110010-- num
-----------------------
num = a5a5a5a5 mask = b2b2b2b2 start = 0 end = 32
10100101101001011010010110100101-- num
10110010101100101011001010110010-- num
10110010101100101011001010110010-- num
-----------------------
Press any key to continue . . .