# Bit set full length

How to determine what is length of bits in bit set (zeros needs to be counted too)

``````uint16_t min = 1000000001;
uint16_t st1  = 10000000001;
uint16_t st2  = 100000000001;
uint16_t max = 1001000000001;
``````

Every method i found it is counting only "1"

fireAngel:
Every method i found it is counting only "1"

All methods I know give 16.

``````sizeof(min)*8
``````

First of all, none of those are binary numbers, so they won't fit in a uint16_t.
You probably meant:

``````uint16_t min = 0b1000000001;
``````

Second, I'm not sure I understand what you mean.
Is bitSeqLen(0b10001) supposed to be 5?
What about bitSeqLen(0b101000)? 6, or 3?
Assuming the latter, you could do:

``````// Obscure and mysterious magic code!
#define bitSeqLen(x) ((sizeof(x)*8) - (__builtin_clz(x) + __builtin_ctz(x)))
``````

(I think ... if this is homework, it would be very unwise to hand that in as a solution, unless you figure out and describe exactly how it works. But looking into it might offer some clues.)

fireAngel:
How to determine what is length of bits in bit set (zeros needs to be counted too)

``````uint16_t min = 1000000001;
``````

uint16_t st1  = 10000000001;
uint16_t st2  = 100000000001;
uint16_t max = 1001000000001;

``````

Every method i found it is counting only "1"
``````

sorry but could you clarify the above? the initialised values in your example are in binary right ie if converted to DEC that would be:

``````uint16_t min = 513; //1000000001
uint16_t st1  = 1025; //10000000001
uint16_t st2  = 2049; //100000000001
uint16_t max = 4609; //1001000000001
``````

so tweaking @Whandall example to count 1's, I guess you can use this to find the "length of bits in bit set (zeros needs to be counted too)"

``````//using 'min' as example
uint16_t min = 513; //1000000001
uint8_t bit_cnt;

bit_cnt=0;
for (; min; min >>= 1) {
bit_cnt++;
}

Serial.print("min bit length:");
Serial.println(bit_cnt,DEC);
``````

You can delete the leftmost bit in a twos-complement number like so:

``````int numbits = 0;
while(x) {
x = x & (x-1);
numbits++;
}
``````

``````bit_cnt=0;
``````

for (; min; min >>= 1) {
bit_cnt++;
}

Works just fine ... thanks!!! (pumping Karma now)

``````if (bit_cnt> 14)break;
``````

to stop it if communication is broken (this is was needed for rev.eng. a communication protocol )

Given that the ‘length’ of variables is set along define boundaries, presumably you are looking for a means to determine how many msb are zero. So the position of the first non-zero bit determines the length?

Example 5 is 0b00000101 so the length would be 3?

If true,

``````byte x = (sizeof(c) * 8);
while(x)
{
if(c & (1 << (x-1))) break;
else x--;
}
``````

will decrement the sizeof c until the first non-zero bit is located and will have the ‘length’ in x.