language: C99 strict (gcc-4.7.2)
date: 255 days 23 hours ago
link:
visibility: public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <limits.h>
#include <assert.h>
#include <stdio.h>
 
unsigned pad(unsigned pattern, unsigned patternLen,
             unsigned leftBit, unsigned leftBitCnt,
             unsigned rightBit, unsigned rightBitCnt)
{
  unsigned r;
  assert(leftBitCnt < sizeof(unsigned) * CHAR_BIT);
  assert(rightBitCnt < sizeof(unsigned) * CHAR_BIT);
  assert(patternLen < sizeof(unsigned) * CHAR_BIT);
  assert(leftBitCnt + patternLen + rightBitCnt <= sizeof(unsigned) * CHAR_BIT);
 
  r = (leftBit << leftBitCnt) - leftBit;
  r <<= patternLen;
  r |= pattern;
  r <<= rightBitCnt;
  r |= (rightBit << rightBitCnt) - rightBit;
 
  return r;
}
 
void printBin(unsigned x)
{
  unsigned i;
  for (i = 0; i < sizeof(unsigned) * CHAR_BIT; i++)
    printf("%u", (x >> (sizeof(unsigned) * CHAR_BIT - 1 - i)) & 1);
  printf("\n");
}
 
int main(void)
{
  printBin(pad(0x0F0, 12, 0, 2, 0, 2));
  printBin(pad(0x0F0, 12, 0, 2, 1, 2));
  printBin(pad(0x0F0, 12, 1, 2, 0, 2));
  printBin(pad(0x0F0, 12, 1, 2, 1, 2));
  return 0;
}