Re: Shift elements of an array
On Sun, 6 Oct 2013 07:12:46 -0700 (PDT), Vlad from Moscow wrote:
I have understood nothing. What is the relation between the original task and your post?
???????????, 6 ??????? 2013??., 14:14:40 UTC+4 ???????????? Rosario1903 ???????:
On Fri, 4 Oct 2013 13:44:22 -0700 (PDT), Vlad from Moscow wrote:
Rotating is not the same as shifting.
if you have in r[15] the rotate division of n bit of a[15]
for obtain the shift division it is enought fill the range of bit
15*sizeof(*a)*CHAR_BIT..(15*sizeof(*a)*CHAR_BIT-n)
with 0 bit
if it is shift mult
and ave in r[15] rotate mult
fill the range of r[15]
0..n with 0 bit
i read wrong it seem to me the problem was shift one array of bit...
even if i'm not a C++ expert, this is my try in shift one array of
chars:
#include <iostream>
#include <stdlib.h>
using namespace std;
#define u32 unsigned
#define u8 unsigned char
class myarray{
public:
myarray(){arr=(u8*) malloc(15);
if(arr==0) exit(-1);
s=15;
}
myarray(u32 c)
{if(c>0xFFFF) exit(-1);
arr=(u8*)malloc(c);
if(arr==0) exit(-1);
s=c;
}
myarray(char* c)
{u32 v, i;
if(c==0)
{v=1;}
else {v=strlen(c)+1;}
arr=(u8*)malloc(v);
if(arr==0) exit(-1);
if(v==1) *arr=0;
else {for(i=0; i<v ; ++i)
{arr[i]=c[i];
if(c[i]==0) break;
}
for(; i<v;++i)
arr[i]=0;
}
s=v;
}
friend ostream& operator<<(ostream& os, myarray& ma)
{u32 i;
if(ma.s!=0)
for(i=0; i<ma.s-1; ++i)
os<<ma.arr[i];
return os<<ma.arr[i];
}
u32 shiftd(myarray& ma, u32 pos)
{u32 i, j;
if(s<ma.s)
{free(arr);
arr=(u8*)malloc(ma.s);
if(arr==0) exit(-1);
s=ma.s;
}
if(pos>=s)
{for(i=0;i<s; ++i) arr[i]=0;}
else {/* 0 1 2 3 4 5 6 */
/* | shiftd 3*/
j=pos;
for(i=0;j<s;++j,++i)
arr[i]=ma.arr[j];
for(;i<s;++i)
arr[i]=0;
}
return 1;
}
u32 s;
u8 *arr;
};
int main()
{myarray v("this and that"), ma;
cout<<"at start v=["<<v <<"]\n";
ma.shiftd(v, 3);
cout<<"at end ma=["<<ma<<"]\n";
return 0;
}
-----------------
at start v=[this and that ]
at end ma=[s and that ]