'Clipping a binary number to required length C/C++

I have written a short function to convert an input decimal number to a binary output. However, at a much higher level of the code, the end user should toggle an option as to whether or not they desire a 5B or 10B value. For the sake of some other low level maths, I have to clip the data here.

So I need some help figuring out how to clip the output to a desired length and stuff the required number of leading zeros.

The incomplete C code:

long dec2bin(int x_dec,int res)
{
    long x_bin = 0;
    int x_bin_len;
    int x_rem, i = 1;
    while (x_dec != 0)
    {
        x_rem = x_dec % 2;
        x_dec /= 2;
        x_bin += x_rem * i;
        i *= 10;
    }
    return x_bin;
}

I had completed a working proof of concept using python. The end application however, requires I write this in C.

The working python script:

def dec2bin(x_dec,x_res):
    x_bin = bin(x_dec)[2:]                      #Convert to Binary (Remove 0B Prefix)
    x_len = len(x_bin)                          
    if x_len < x_res:                           #If Smaller than desired resolution
        x_bin = '0' * (x_res-x_len) + x_bin     #Stuff with leading 0s
    if x_len > x_res:                           #If larger than desired resolution
        x_bin = x_bin[x_len-x_res:x_len]        #Display desired no. LSBs
    return x_bin

I'm sure this has been done before, Indeed, my python script proves it should be relatively straightforward, but I'm not as experienced with C.

Any help is greatly appreciated.

  • Mark.


Solution 1:[1]

As @yano suggested, I think you have to return an ascii string to the caller, rather than a long. Below's the short function I wrote for my own purposes, for any base...

char *itoa ( int i, int base, int ndigits ) {
  static char a[999], digits[99] = /* up to base 65 */
    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$*";
  int n=ndigits;
  memset(a,'0',ndigits);  a[ndigits]='\000';
  while ( --n >= 0) {
    a[n] = digits[i%base];
    if ( (i/=base) < 1 ) break; }
  return ( a );
  } /* --- end-of-function itoa() --- */

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 eigengrau