print bytes that have reversed bits.

Discussion in 'C Programming' started by ericmatteson2003november@hotmail.com, Mar 17, 2008.

  1. Guest

    This example program in c reverses order
    of bits within a byte and
    prints the integer byte result out on screen in
    base 10 ascii including suppressing
    leading zeroes.
    program listing is next */
    // this revmake.c was written by Eric Matteson.
    // permission is granted to copy this program.
    // reverse bits in each number in array 0-255;
    // 1 becomes -128
    // 2 becomes 64
    // 4 becomes 32
    #include<stdio.h>
    int hmanyout(char* outres,int insign)
    {
    int intun,base,irem,iprod,frac,isgn;
    int revctr,fwctr;
    int dst[15];
    revctr=10;
    isgn=0;
    base=10;
    intun=insign;
    if(insign < 0)
    {
    intun = 0 - insign;
    isgn=1;
    }
    while(revctr >= 0)
    {
    frac = intun / base;
    iprod = base * frac;
    irem = intun - iprod;
    if(irem < 0)
    {
    frac = frac - 1;
    iprod = base * frac;
    irem = intun - iprod;
    }
    dst[revctr] = irem;
    intun = frac;
    revctr = revctr - 1;
    }
    revctr=0;
    irem=0;
    while((irem == 0)&&(revctr < 9))
    {
    revctr=revctr+1;
    irem=dst[revctr];
    if(irem != 0)revctr=revctr-1;
    }
    // max revctr == 9 rightmost digit at dst[10]
    if(isgn == 1)
    {
    *(outres)='-';
    }
    while(revctr < 10)
    {
    irem=dst[revctr+1]+48;
    *(outres + isgn)=(char)irem;
    isgn=isgn+1;
    revctr=revctr+1;
    }
    if(insign != (0-1))
    {
    *(outres + isgn)=',';
    isgn = isgn + 1;
    }
    if(insign == (0-1))
    {
    *(outres + isgn)='}';
    *(outres + (isgn+1))=';';
    isgn = isgn + 2;
    }
    *(outres + isgn)=(char)13;
    *(outres + (isgn+1))=(char)10;
    return isgn;
    }
    int revbits(int revin)
    {
    int revout,revctr,revterm;
    revctr=0;
    revout=0;
    revterm=revin;
    revloop: revctr=revctr+1;
    revout = revout + revout;
    revout = revout + (revterm & 1);
    revterm = revterm >> 1;
    if(revctr < 8)goto revloop;
    return revout;
    }
    int main(char** uuc,int ui)
    {
    char tex[80];
    int olop,ilop,tctr,twid,treb,xctr;
    FILE* revhan;
    revhan = stdout;
    xctr=0;
    olop=0;
    while(olop < 32)
    {
    tctr=0;
    while(tctr < 80)
    {
    tex[tctr]=(char)32;
    tctr=tctr+1;
    }
    twid=4 ;
    if(olop == 0)
    {
    tex[3]='i';
    tex[4]='n';
    tex[5]='t';
    // 6 is blank
    tex[7]='t';
    tex[8]='r';
    tex[9]='e';
    tex[10]='v';
    tex[11]='[';
    tex[12]=']';
    tex[13]='=';
    tex[14]='{';
    // length = 15;
    twid=15;
    }
    fwrite(tex,1,twid,revhan);
    ilop=0;
    while(ilop < 8)
    {
    treb=revbits(xctr);
    if(treb > 127)treb=treb-256;
    twid=hmanyout(tex,treb);
    if(ilop == 7)twid = twid + 2;
    xctr=xctr+1;
    fwrite(tex,1,twid,revhan);
    ilop=ilop+1;
    }
    olop=olop+1;
    }
    return 0;
    }
    // this is last line of revmake.c
    /* after end of program.
    , Mar 17, 2008
    #1
    1. Advertising

  2. user923005 Guest

    On Mar 17, 3:33 pm, wrote:
    >  This example program in c reverses order
    > of bits within a byte and
    > prints the integer byte result out on screen in
    > base 10 ascii including suppressing
    > leading zeroes.
    > program listing is next */
    > // this revmake.c was written by Eric Matteson.
    > // permission is granted to copy this program.
    > // reverse bits in each number in array  0-255;
    > // 1 becomes -128
    > // 2 becomes 64
    > // 4 becomes 32
    >   #include<stdio.h>
    >   int hmanyout(char* outres,int insign)
    >   {
    >   int intun,base,irem,iprod,frac,isgn;
    >   int revctr,fwctr;
    >   int dst[15];
    >   revctr=10;
    >   isgn=0;
    >   base=10;
    >   intun=insign;
    >     if(insign < 0)
    >     {
    >     intun = 0 - insign;
    >     isgn=1;
    >     }
    >     while(revctr >= 0)
    >     {
    >     frac = intun / base;
    >     iprod = base * frac;
    >     irem = intun - iprod;
    >      if(irem < 0)
    >      {
    >      frac = frac - 1;
    >      iprod = base * frac;
    >      irem = intun - iprod;
    >      }
    >     dst[revctr] = irem;
    >     intun = frac;
    >     revctr = revctr - 1;
    >     }
    >   revctr=0;
    >   irem=0;
    >     while((irem == 0)&&(revctr < 9))
    >     {
    >     revctr=revctr+1;
    >     irem=dst[revctr];
    >     if(irem != 0)revctr=revctr-1;
    >     }
    > // max revctr == 9       rightmost digit at dst[10]
    >     if(isgn == 1)
    >     {
    >     *(outres)='-';
    >     }
    >     while(revctr < 10)
    >     {
    >     irem=dst[revctr+1]+48;
    >     *(outres + isgn)=(char)irem;
    >     isgn=isgn+1;
    >     revctr=revctr+1;
    >     }
    >     if(insign != (0-1))
    >     {
    >     *(outres + isgn)=',';
    >     isgn = isgn + 1;
    >     }
    >     if(insign == (0-1))
    >     {
    >     *(outres + isgn)='}';
    >     *(outres + (isgn+1))=';';
    >     isgn = isgn + 2;
    >     }
    >   *(outres + isgn)=(char)13;
    >   *(outres + (isgn+1))=(char)10;
    >   return isgn;
    >   }
    >   int revbits(int revin)
    >   {
    >   int revout,revctr,revterm;
    >   revctr=0;
    >   revout=0;
    >   revterm=revin;
    > revloop:  revctr=revctr+1;
    >   revout = revout + revout;
    >   revout = revout + (revterm & 1);
    >   revterm = revterm >> 1;
    >   if(revctr < 8)goto revloop;
    >   return revout;
    >   }
    >   int main(char** uuc,int ui)
    >   {
    >   char tex[80];
    >   int olop,ilop,tctr,twid,treb,xctr;
    >   FILE* revhan;
    >   revhan = stdout;
    >   xctr=0;
    >   olop=0;
    >   while(olop < 32)
    >   {
    >   tctr=0;
    >   while(tctr < 80)
    >   {
    >   tex[tctr]=(char)32;
    >   tctr=tctr+1;
    >   }
    >   twid=4 ;
    >   if(olop == 0)
    >   {
    >   tex[3]='i';
    >   tex[4]='n';
    >   tex[5]='t';
    > //    6 is blank
    >   tex[7]='t';
    >   tex[8]='r';
    >   tex[9]='e';
    >   tex[10]='v';
    >   tex[11]='[';
    >   tex[12]=']';
    >   tex[13]='=';
    >   tex[14]='{';
    > // length = 15;
    >   twid=15;
    >   }
    >   fwrite(tex,1,twid,revhan);
    >   ilop=0;
    >     while(ilop < 8)
    >     {
    >     treb=revbits(xctr);
    >     if(treb > 127)treb=treb-256;
    >     twid=hmanyout(tex,treb);
    >     if(ilop == 7)twid = twid + 2;
    >     xctr=xctr+1;
    >     fwrite(tex,1,twid,revhan);
    >     ilop=ilop+1;
    >     }
    >   olop=olop+1;
    >   }
    >   return 0;
    >   }
    > // this is last line of revmake.c
    > /* after end of program.


    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    /* I saw this from Dan Pop: */
    unsigned rbits(unsigned int c)
    {
    c = (c & 0x0F) << 4 | (c & 0xF0) >> 4;
    c = (c & 0x33) << 2 | (c & 0xCC) >> 2;
    c = (c & 0x55) << 1 | (c & 0xAA) >> 1;
    return c;
    }

    int main(void)
    {
    unsigned i;
    for (i = 0; i <= UCHAR_MAX; i++)
    printf("c=%u, reversed c = %u\n", i, rbits(i));
    return 0;
    }
    user923005, Mar 17, 2008
    #2
    1. Advertising

  3. writes:

    > int main(char** uuc,int ui)


    ??

    > twid=4 ;


    You missed a space. :)

    --
    Ben.
    Ben Bacarisse, Mar 17, 2008
    #3
  4. said:

    > This example program in c reverses order
    > of bits within a byte and
    > prints the integer byte result out on screen in
    > base 10 ascii including suppressing
    > leading zeroes.


    I was somewhat surprised to find that this program (after a little light
    surgery on BCPL comments) actually compiled, in conforming mode. One of
    its more interesting features is that although it appears to meet the
    author's claim to display the integer results in ASCII, *regardless of the
    native character set for the implementation*, nevertheless the non-integer
    results use the native character set. So if you run this on a box that
    uses ASCII, you'll notice nothing untoward. But if you run it on a
    mainframe...

    <snip>

    --
    Richard Heathfield <http://www.cpax.org.uk>
    Email: -http://www. +rjh@
    Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
    "Usenet is a strange place" - dmr 29 July 1999
    Richard Heathfield, Mar 18, 2008
    #4
  5. Guest

    On Mar 17, 9:46 pm, Richard Heathfield <> wrote:
    > said:
    >
    > > This example program in c reverses order
    > > of bits within a byte and
    > > prints the integer byte result out on screen in
    > > base 10 ascii including suppressing
    > > leading zeroes.

    >
    > I was somewhat surprised to find that this program (after a little light
    > surgery on BCPL comments) actually compiled, in conforming mode. One of
    > its more interesting features is that although it appears to meet the
    > author's claim to display the integer results in ASCII, *regardless of the
    > native character set for the implementation*, nevertheless the non-integer
    > results use the native character set. So if you run this on a box that
    > uses ASCII, you'll notice nothing untoward. But if you run it on a
    > mainframe...
    >
    > <snip>
    >
    > --
    > Richard Heathfield <http://www.cpax.org.uk>
    > Email: -http://www. +rjh@
    > Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
    > "Usenet is a strange place" - dmr 29 July 1999

    Try this other version on a mainframe ...
    I have replaced adding to 48 with an array of
    current character digits mframe[]
    */
    // beginning of revmain.c
    // revmain.c is written by Eric Matteson
    // reverse bits in each number in array 0-255;
    #include<stdio.h>
    char mframe[]={"0123456789"};
    int hmanyout(char* outres,int insign)
    {
    int intun,base,irem,iprod,frac,isgn;
    int revctr,fwctr;
    int dst[15];
    revctr=10;
    isgn=0;
    base=10;
    intun=insign;
    if(insign < 0)
    {
    intun = 0 - insign;
    isgn=1;
    }
    while(revctr >= 0)
    {
    frac = intun / base;
    iprod = base * frac;
    irem = intun - iprod;
    if(irem < 0)
    {
    frac = frac - 1;
    iprod = base * frac;
    irem = intun - iprod;
    }
    dst[revctr] = irem;
    intun = frac;
    revctr = revctr - 1;
    }
    revctr=0;
    irem=0;
    while((irem == 0)&&(revctr < 9))
    {
    revctr=revctr+1;
    irem=dst[revctr];
    if(irem != 0)revctr=revctr-1;
    }
    // max revctr == 9 rightmost digit at dst[10]
    if(isgn == 1)
    {
    *(outres)='-';
    }
    while(revctr < 10)
    {
    irem=dst[revctr+1];
    // mframe[] is list of character digits
    *(outres + isgn)=mframe[irem];
    isgn=isgn+1;
    revctr=revctr+1;
    }
    if(insign != (0-1))
    {
    *(outres + isgn)=',';
    isgn = isgn + 1;
    }
    if(insign == (0-1))
    {
    *(outres + isgn)='}';
    *(outres + (isgn+1))=';';
    isgn = isgn + 2;
    }
    *(outres + isgn)=(char)13;
    *(outres + (isgn+1))=(char)10;
    return isgn;
    }
    int revbits(int revin)
    {
    int revout,revctr,revterm;
    revctr=0;
    revout=0;
    revterm=revin;
    revloop: revctr=revctr+1;
    revout = revout + revout;
    revout = revout + (revterm & 1);
    revterm = revterm >> 1;
    if(revctr < 8)goto revloop;
    return revout;
    }
    int main(int ui,char** uuc)
    {
    char tex[80];
    int olop,ilop,tctr,twid,treb,xctr;
    FILE* revhan;
    revhan = stdout;
    xctr=0;
    olop=0;
    while(olop < 32)
    {
    tctr=0;
    while(tctr < 80)
    {
    tex[tctr]=(char)32;
    tctr=tctr+1;
    }
    twid=4 ;
    if(olop == 0)
    {
    tex[3]='i';
    tex[4]='n';
    tex[5]='t';
    // 6 is blank
    tex[7]='t';
    tex[8]='r';
    tex[9]='e';
    tex[10]='v';
    tex[11]='[';
    tex[12]=']';
    tex[13]='=';
    tex[14]='{';
    // length = 15;
    twid=15;
    }
    fwrite(tex,1,twid,revhan);
    ilop=0;
    while(ilop < 8)
    {
    treb=revbits(xctr);
    if(treb > 127)treb=treb-256;
    twid=hmanyout(tex,treb);
    if(ilop == 7)twid = twid + 2;
    xctr=xctr+1;
    fwrite(tex,1,twid,revhan);
    ilop=ilop+1;
    }
    olop=olop+1;
    }
    return 0;
    }
    // end of revmain.c
    /* --
    , Mar 25, 2008
    #5
  6. wrote:
    > Richard Heathfield <> wrote:
    > > ...
    > > I was somewhat surprised to find that this program (after
    > > a little light surgery on BCPL comments) actually compiled,
    > > in conforming mode. One of its more interesting features
    > > is that although it appears to meet the author's claim to
    > > display the integer results in ASCII, *regardless of the
    > > native character set for the implementation*, nevertheless
    > > the non-integer results use the native character set. So
    > > if you run this on a box that uses ASCII, you'll notice
    > > nothing untoward. But if you run it on a mainframe...

    >
    > Try this other version on a mainframe ...
    > I have replaced adding to 48 with an array of
    > current character digits mframe[]


    Why? Note that '0', '1', '2' ... '9' are required to be
    consecutive, i.e. '1' == '0' + 1, '2' == '0' + 2, etc...
    up to '9' = '0' + 9;

    The point is, why assume or require ASCII?

    >   */
    > // beginning of revmain.c
    > // revmain.c is written by Eric Matteson
    > // reverse bits in each number in array  0-255;


    <snip 120+ line program>

    #include <stdio.h>

    unsigned char rev_octet(unsigned char x)
    {
    unsigned y, i;
    for (y = i = 0; i < 8; i++, x >>= 1)
    y = (y << 1) | (x & 1u);
    return y;
    }

    int main(void)
    {
    int i;

    printf("int trev[]={\n");

    for (i = 0; i < 256; i++)
    {
    int x = rev_octet(i);
    if (x >= 0x80) x = x - 256; /* 8-bit 2c */
    printf("%d", x);
    if (i != 255) putchar(',');
    if ((i + 1) % 8 == 0) putchar('\n');
    }

    printf("}\n");

    return 0;
    }

    That said, I'd actually use the pre-processor in the
    destination source file...

    #define B8(p) B7(p), B7(p + 1)
    #define B7(p) B6(p), B6(p + 2)
    #define B6(p) B5(p), B5(p + 4)
    #define B5(p) B4(p), B4(p + 8)
    #define B4(p) B3(p), B3(p + 16)
    #define B3(p) B2(p), B2(p + 32)
    #define B2(p) B1(p), B1(p + 64)
    #define B1(p) p , p - 128

    int trev[] = { B8(0) };

    --
    Peter
    Peter Nilsson, Mar 25, 2008
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Danny Anderson
    Replies:
    10
    Views:
    493
    Niklas Borson
    Oct 14, 2003
  2. David Li

    the byte be reversed! why?

    David Li, Apr 24, 2005, in forum: C++
    Replies:
    7
    Views:
    439
    David Li
    Apr 24, 2005
  3. mark
    Replies:
    2
    Views:
    274
    Dave K
    Jan 3, 2004
  4. Stefan Behnel

    reversed heapification?

    Stefan Behnel, Mar 7, 2005, in forum: Python
    Replies:
    6
    Views:
    307
    Stefan Behnel
    Mar 7, 2005
  5. david.karr
    Replies:
    1
    Views:
    331
    david.karr
    Sep 7, 2007
Loading...

Share This Page