|
|
View previous topic :: View next topic |
Author |
Message |
[email protected]
Joined: 28 Jul 2014 Posts: 38
|
10 bits conversion |
Posted: Wed Jan 06, 2021 3:44 am |
|
|
i have a 10 bits in an array
bits[]={1,1,1,1,1,1,1,1,1,1};
the value of the above is = 1023
now how can i convert the bits in the array and store the result in int16 bit variable. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19551
|
|
Posted: Wed Jan 06, 2021 6:55 am |
|
|
There are lots of different ways. However by far the most efficient
(depending on how the 'bits' are stored), is to use a union or a #locate.
Now I say 'depending on how the bits are stored'. This approach only works
if they are stored as int1 values.
Code: |
union {
unsigned int16 word;
int1 bits[10];
} combiner;
//Then if combiner.bits is used as the array, combiner.word contains
//the 16bit value.
//You can also do the same effective thing using #locate.
int1 bits[] = {1,1,1,1,1,1,1,1,1,1};
unsigned int16 word;
#locate word=bits;
//Then word is the int equivalent of the int1 array.
|
If the values are not int1, then you have to build the result manually.
Unfortunately, this then wastes a lot of processor time. The most efficient
way is:
Code: |
unsigned int16 from_bits(void)
{
unsigned int16 mask=1, result=0;
unsigned int8 ctr;
for (ctr=0;ctr<10;ctr++)
{
if (bits[ctr])
result+=mask;
mask<<=1;
}
return result;
}
|
|
|
|
[email protected]
Joined: 28 Jul 2014 Posts: 38
|
|
Posted: Wed Jan 06, 2021 7:33 am |
|
|
Ttelmah wrote: | There are lots of different ways. However by far the most efficient
(depending on how the 'bits' are stored), is to use a union or a #locate.
Now I say 'depending on how the bits are stored'. This approach only works
if they are stored as int1 values.
Code: |
union {
unsigned int16 word;
int1 bits[10];
} combiner;
//Then if combiner.bits is used as the array, combiner.word contains
//the 16bit value.
thank you for your reply your code is working.
this is my code this is also working but yours is simple!
while(true)
{
unsigned int8 dd[]={0,0,0,0,0,0,0,0,0,1};
unsigned int16 val=0;
unsigned int16 mul=0;
for(int8 i=0;i<10;i++)
{
mul=mul*2;
if(mul==0)
{
mul=1;
}
if(dd[i]==1)
{
val=val+mul;
}
}
lcd_gotoxy(1, 1);
printf(lcd_putc1, "%04lu",val);
}
//You can also do the same effective thing using #locate.
int1 bits[] = {1,1,1,1,1,1,1,1,1,1};
unsigned int16 word;
#locate word=bits;
//Then word is the int equivalent of the int1 array.
|
If the values are not int1, then you have to build the result manually.
Unfortunately, this then wastes a lot of processor time. The most efficient
way is:
Code: |
unsigned int16 from_bits(void)
{
unsigned int16 mask=1, result=0;
unsigned int8 ctr;
for (ctr=0;ctr<10;ctr++)
{
if (bits[ctr])
result+=mask;
mask<<=1;
}
return result;
}
|
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Wed Jan 06, 2021 7:58 am |
|
|
yeesh, I was looking and thinking about this while coffee slowly dripped,dripped, drip...
Mr. T's union is perfect !!
I was looking at a loop with bit_test to make the sum then sorry, got distracted with fresh coffee...
Providing the 'order' of the bits is correct, the union is the fastest,easiest way to do it.
Jay |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|