Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   Efficient shifting of a flat buffer (http://www.velocityreviews.com/forums/t595664-efficient-shifting-of-a-flat-buffer.html)

Madhur 03-03-2008 09:16 AM

Efficient shifting of a flat buffer
 
I would like to know the best efficient way to shift a flat buffer by
say 4bits.

for exaple if the flat buffer is

0x62 0x48 0x23 ....

then the result should be

0x06 0x24 0x82 0x3.....

byte by byte shifting somehow looked very inefficient.


Something like
int main()
{
unsigned char sample1[50];
unsigned char sample2[50];
int i;

for(i=0; i < 50; i++)
{
sample1[i] = rand(250);
}

for(i=0 ; i < 50; i++)
{
printf("%02x \n",sample1[i]);
}

printf(" output after shifting\n");
sample2[0] = sample1[0]>>4;
for(i=1; i <= 50; i++)
{
sample2[i] = (sample1[i-1] << 4) | (sample1[i]>>4);
printf("%02x \n",sample2[i]);
}

return 0;
}

Is there any other best way to do this.

Zara 03-03-2008 09:54 AM

Re: Efficient shifting of a flat buffer
 
On Mon, 3 Mar 2008 01:16:31 -0800 (PST), Madhur <madhurrajn@gmail.com>
wrote:

>I would like to know the best efficient way to shift a flat buffer by
>say 4bits.
>
>for exaple if the flat buffer is
>
>0x62 0x48 0x23 ....
>
>then the result should be
>
>0x06 0x24 0x82 0x3.....
>
>byte by byte shifting somehow looked very inefficient.
>
>
>Something like
>int main()
>{
> unsigned char sample1[50];
> unsigned char sample2[50];
> int i;
>
> for(i=0; i < 50; i++)
> {
> sample1[i] = rand(250);
> }
>
> for(i=0 ; i < 50; i++)
> {
> printf("%02x \n",sample1[i]);
> }
>
> printf(" output after shifting\n");
> sample2[0] = sample1[0]>>4;
> for(i=1; i <= 50; i++)
> {
> sample2[i] = (sample1[i-1] << 4) | (sample1[i]>>4);
> printf("%02x \n",sample2[i]);
> }
>
> return 0;
>}
>
>Is there any other best way to do this.


reducing the number or reads:

unsigned char last=0;
for (int i=0,i<sizeof(sample);++i) {
unsigned char next=sample1[i];
sample2[i]= (last<<4)|(next>>4);
last=next;
}

But you should profile to be sure it is better

Zara



Bartc 03-03-2008 11:49 AM

Re: Efficient shifting of a flat buffer
 

"Madhur" <madhurrajn@gmail.com> wrote in message
news:d73fd4e5-e4e0-4675-826c-8a956b4411b8@s8g2000prg.googlegroups.com...
>I would like to know the best efficient way to shift a flat buffer by
> say 4bits.
>
> for exaple if the flat buffer is
>
> 0x62 0x48 0x23 ....
>
> then the result should be
>
> 0x06 0x24 0x82 0x3.....
>
> byte by byte shifting somehow looked very inefficient.
>....


If the hex digits were strung all together, then the above does a right
shift. Your code however seems to do a left shift.

One solution would be to shift 32 or 64 bits at a time (depends on your
machine), but the way you've defined your shift means this results in very
peculiar shift pattern.

If you explained the reason for the shift further then perhaps we could help
better.

--
Bart



SM Ryan 03-04-2008 02:28 PM

Re: Efficient shifting of a flat buffer
 
Madhur <madhurrajn@gmail.com> wrote:
# I would like to know the best efficient way to shift a flat buffer by
# say 4bits.
#
# for exaple if the flat buffer is
#
# 0x62 0x48 0x23 ....
#
# then the result should be
#
# 0x06 0x24 0x82 0x3.....
#
# byte by byte shifting somehow looked very inefficient.

Unless the hardware provides bit vectors, you're going to be
doing aload/shift/mask/or/store loop. A byte at a time is least
likely efficient, but most portable. Depending on alignment and
endianness you can sometimes do it a word at a time, but that
will only work on specific kinds of hardware.

Also some hardware provides a rotate instruction implemented
with a <<< or >>> operator. The two shifts can be replaced
with one rotate if available.

--
SM Ryan http://www.rawbw.com/~wyrmwif/
I hope it feels so good to be right. There's nothing more
exhilarating pointing out the shortcomings of others, is there?


All times are GMT. The time now is 12:35 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.