How do I find the lowest bit position of a mask using only macros?
I want to do everything in compile time. That mean, there cannot be
control statements such as if, while, for, etc. in the macro.
Note that the macro takes only one (1) argument, the mask.
Examples:
// Mask Lowest bit position
0111 0000 4
0001 0000 4
0001 1000 3
0011 1111 0
Thanks. 11 10429 ed*****@yahoo.com (ex laguna) writes: How do I find the lowest bit position of a mask using only macros?
Presumably you mean the lowest bit set to 1.
I want to do everything in compile time. That mean, there cannot be control statements such as if, while, for, etc. in the macro.
#define LOWEST_1_BIT(MASK) \
(((MASK) & 0001) ? 0 : /* bit 0 is set? */
((MASK) & 0002) ? 1 : /* bit 1 is set? */
((MASK) & 0004) ? 2 : /* bit 2 is set? */
((MASK) & 0010) ? 3 : /* bit 3 is set? */
((MASK) & 0020) ? 4 : /* bit 4 is set? */
/* ... */
-1) /* no bits are set */
--
char a[]="\n .CJacehknorstu";int putchar(int);int main(void){unsigned long b[]
={0x67dffdff,0x9aa9aa6a,0xa77ffda9,0x7da6aa6a,0xa6 7f6aaa,0xaa9aa9f6,0x1f6},*p=
b,x,i=24;for(;p+=!*p;*p/=4)switch(x=*p&3)case 0:{return 0;for(p--;i--;i--)case
2:{i++;if(1)break;else default:continue;if(0)case 1:putchar(a[i&15]);break;}}}
On 25 Jul 2003 10:23:20 -0700, ed*****@yahoo.com (ex laguna) wrote: How do I find the lowest bit position of a mask using only macros?
I want to do everything in compile time. That mean, there cannot be control statements such as if, while, for, etc. in the macro.
Note that the macro takes only one (1) argument, the mask.
Examples:
// Mask Lowest bit position 0111 0000 4 0001 0000 4 0001 1000 3 0011 1111 0
You could do that with a lot of ?: operators in sequence, but
you'd need N operators where N is the number of bits.
Alternative you could use lg N macros, like (off the cuff)
#define LOWESTBITPOS2( x ) (x & 0x1? 0 : 1)
#define LOWESTBITPOS4( x ) (x & 0x3? LOWESTBITPOS2( x ) : 2+LOWESTBITPOS2( x >> 2 ))
#define LOWESTBITPOS8( x ) (x & 0xF? LOWESTBITPOS4( x ) : 4+LOWESTBITPOS4( x >> 4 ))
#define LOWESTBITPOS16( x ) (x & 0xFF? LOWESTBITPOS8( x ) : 8+LOWESTBITPOS8( x >> 8 ))
#define LOWESTBITPOS32( x ) (x & 0xFFFF? LOWESTBITPOS16( x ) : 16+LOWESTBITPOS16( x >> 16 ))
#define LOWESTBITPOS( x ) LOWESTBITPOS32( x )
If this works, then I wrote it. If not, then some unscroupolous
evil charlatan impersionated me. Anyway, note the assumption of 32
bits maximum.
Also note the assumption of at least one 1-bit.
If that's not the case you need to decide what the result should
be for a bitpattern of all zeros.
On 25 Jul 2003 14:22:41 -0700, ed*****@yahoo.com (ex laguna) wrote: al***@start.no (Alf P. Steinbach) wrote in message news:<3f***************@News.CIS.DFN.DE>... Also note the assumption of at least one 1-bit.
If that's not the case you need to decide what the result should be for a bitpattern of all zeros.
Yes, the assumption is that the mask is a non-zero constant number known at compile time.
So my question is, would all these "?" statements use any CPU at run time?
Not for a compile-time constant... ;-)
Whether they would for a run-time call is, however, a Quality Of
Implementation issue, i.e. that depends on your compiler.
ex laguna wrote: al***@start.no (Alf P. Steinbach) wrote in message news:<3f***************@News.CIS.DFN.DE>... Also note the assumption of at least one 1-bit.
If that's not the case you need to decide what the result should be for a bitpattern of all zeros.
Yes, the assumption is that the mask is a non-zero constant number known at compile time.
So my question is, would all these "?" statements use any CPU at run time?
Probably not. The expression is a "constant expression,"
meaning that it can be evaluated at compile time and could
be used anywhere a constant can be used. However, there is
no absolute guarantee in the Standard that an expression
that *can* be evaluated at compile time *will* be evaluated
at compile time. An implementation that didn't do so would
certainly be regarded as perverse, but ...
-- Er*********@sun.com ed*****@yahoo.com (ex laguna) wrote in message news:<53************************@posting.google.co m>... How do I find the lowest bit position of a mask using only macros?
I want to do everything in compile time. That mean, there cannot be control statements such as if, while, for, etc. in the macro.
Note that the macro takes only one (1) argument, the mask.
Examples:
// Mask Lowest bit position 0111 0000 4 0001 0000 4 0001 1000 3 0011 1111 0
Thanks.
If your mask is an unsigned integer then (mask & -mask) will produce
the lowest masked bit. That's not what you asked for, but it may be
suitable for your underlying problem.
--
Peter
On Fri, 25 Jul 2003 20:52:59 -0400, Peter Nilsson wrote: If your mask is an unsigned integer then (mask & -mask) will produce the lowest masked bit. That's not what you asked for, but it may be suitable for your underlying problem.
....and if you multiply or divide by the result of that it gives you the
same result as shifting by the index of that bit. For example if mask
0x08 is bit 4:
val / (0x08 & -0x08)
is the same as
val >> 4
So if the OP is going to use the value to shift they could multiply or
divide instead.
This leads to a nice macro for decoding bitfields:
#define FLD(i, m) (m != 0 ? ((i) & (m)) / ((m) & -(m)) : 0)
Mike
Michael B Allen <mb*****@ioplex.com> wrote in message news:<pa**********************************@ioplex. com>... On Fri, 25 Jul 2003 20:52:59 -0400, Peter Nilsson wrote:
If your mask is an unsigned integer then (mask & -mask) will produce the lowest masked bit. That's not what you asked for, but it may be suitable for your underlying problem.
...and if you multiply or divide by the result of that it gives you the same result as shifting by the index of that bit. For example if mask 0x08 is bit 4:
val / (0x08 & -0x08)
is the same as
val >> 4
So if the OP is going to use the value to shift they could multiply or divide instead.
This leads to a nice macro for decoding bitfields:
#define FLD(i, m) (m != 0 ? ((i) & (m)) / ((m) & -(m)) : 0)
Mike
Thank you very much Mike. This is exactly what I am looking for. I am
writing a communications message protocol parser, so I only have to
define the bit masks of the messages.
Best Regards,
Ex Laguna ed*****@yahoo.com (ex laguna) wrote in message news:<53**********************@posting.google.com> ... Michael B Allen <mb*****@ioplex.com> wrote in message news:<pa**********************************@ioplex. com>... On Fri, 25 Jul 2003 20:52:59 -0400, Peter Nilsson wrote:
If your mask is an unsigned integer
I should have added "of int rank or higher..."
then (mask & -mask) will produce the lowest masked bit. That's not what you asked for, but it may be suitable for your underlying problem. ...and if you multiply or divide by the result of that it gives you the same result as shifting by the index of that bit. For example if mask 0x08 is bit 4:
val / (0x08 & -0x08)
That's potential division by zero. Use 0x08u. is the same as
val >> 4
ITYM val >> 3 So if the OP is going to use the value to shift they could multiply or divide instead.
This leads to a nice macro for decoding bitfields:
#define FLD(i, m) (m != 0 ? ((i) & (m)) / ((m) & -(m)) : 0)
Might as well have ((m) != 0 ? ...
Thank you very much Mike. This is exactly what I am looking for. I am writing a communications message protocol parser, so I only have to define the bit masks of the messages.
As I thought, the old communication problem: I need to solve A, I
*think* I need to do B, so I'll ask how to solve B... ;)
--
Peter
On Sat, 26 Jul 2003 19:09:29 -0400, Peter Nilsson wrote: > mask 0x08 is bit 4: > > val / (0x08 & -0x08) That's potential division by zero. Use 0x08u.
That's what the ((m) != 0 ? ... is for. > > #define FLD(i, m) (m != 0 ? ((i) & (m)) / ((m) & -(m)) : 0)
Might as well have ((m) != 0 ? ...
Right.
Mike
Michael B Allen <mb*****@ioplex.com> wrote in message news:<pa*********************************@ioplex.c om>... On Sat, 26 Jul 2003 19:09:29 -0400, Peter Nilsson wrote: > mask 0x08 is bit 4: > > val / (0x08 & -0x08)
That's potential division by zero. Use 0x08u.
That's what the ((m) != 0 ? ... is for.
??? 0x08 is non-zero.
You're missing the fact that it's a *signed* int. On a one's
completement implementation the expression (0x08 & -0x08) evaluates to
0.
--
Peter This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Charles Law |
last post by:
Sorry for posting this here, but although I have posted to the Infragistics
group, it is not so frequently used, and I fear a long wait for a response.
There are undoubtedly Infragistics users...
|
by: Sunny123 |
last post by:
hello
i am trying to find the maximum value of a function and where it occur.
i.e there is an array
x |y
=============
|
|
|
by: sagar |
last post by:
is there any way to find the position of mouse click on a form
actually the problem is i m having more than one controls on a form i
want to find which control is selected using mouse down
any...
|
by: Sunil Varma |
last post by:
Hi,
I've to write a function similar to this.
int process(const vector<int>& vct,int key)
{
// Here I've to find the position of key in the vector and do some
processing.
}
|
by: vunet.us |
last post by:
I have a DIV element. How can I find mouse position (top and left)
inside of this DIV?
<div onMouseMove="getPositions();"
style="width:200px;height:100px"></div>
function getPositions(ev){...
|
by: Patrick Fisher |
last post by:
Hi
I have tables from 12 suppliers each of whom can supply the same part,
I need to be able to create a table or query containing a list of
suppliers who can supply at the lowest price for each...
|
by: slizorn |
last post by:
hi guys,
i need to make a tree traversal algorithm that would help me search the tree..
creating a method to search a tree to find the position of node and to return its pointer value
basically i...
|
by: NKTA |
last post by:
Hello again.
I have a doubt in how to obtain the position of an image in a table cell.
What i want to do is:
- Find the image position, and add a new image on top of that image.
The...
|
by: vibhakhushi |
last post by:
I have an array
@myarray = ("father","mother","sister","brother");
How to find the position of "sister" in @myarray
I didn't get any built in functions to do this. I'm a newbie in Perl....
|
by: lllomh |
last post by:
Define the method first
this.state = {
buttonBackgroundColor: 'green',
isBlinking: false, // A new status is added to identify whether the button is blinking or not
}
autoStart=()=>{
|
by: DJRhino |
last post by:
Was curious if anyone else was having this same issue or not....
I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
|
by: Aliciasmith |
last post by:
In an age dominated by smartphones, having a mobile app for your business is no longer an option; it's a necessity. Whether you're a startup or an established enterprise, finding the right mobile app...
|
by: tracyyun |
last post by:
Hello everyone,
I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
|
by: giovanniandrean |
last post by:
The energy model is structured as follows and uses excel sheets to give input data:
1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
|
by: NeoPa |
last post by:
Hello everyone.
I find myself stuck trying to find the VBA way to get Access to create a PDF of the currently-selected (and open) object (Form or Report).
I know it can be done by selecting :...
|
by: Teri B |
last post by:
Hi, I have created a sub-form Roles. In my course form the user selects the roles assigned to the course.
0ne-to-many. One course many roles.
Then I created a report based on the Course form and...
|
by: NeoPa |
last post by:
Introduction
For this article I'll be focusing on the Report (clsReport) class. This simply handles making the calling Form invisible until all of the Reports opened by it have been closed, when it...
|
by: isladogs |
last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, Mike...
| |