Forum: Mikrocontroller und Digitale Elektronik überprüfen ob mehr als 1 bit gesetzt


von Markus H. (markus652)


Lesenswert?

ahoihoi

eine anfängerfrage:
eine if-abfrage soll ausgeführt werden, sobald in einer 8-bit variable 
mehr als 1 der bits gesetzt ist.

meine lösungsansatz sieh wiefolgt aus und liefert das gewünschte 
ergebnis, nur, schön ist anders... kann man bestimmt eleganter und 
kompakter programieren.
nur wie?
1
  
2
if(!(test_byte==0 || test_byte==1 || test_byte==2 || test_byte==4 || test_byte==8 || test_byte==16 || test_byte==32 || test_byte==64 || test_byte==128))
3
{
4
  printf("mehr als 1 bit gesetzt");
5
}
vielen dank für euren input.

von Krabat (Gast)


Lesenswert?

Warum hältst Du dich nicht an die Netiquette?

von Rainer B. (katastrophenheinz)


Lesenswert?

if ( test_byte > 0 && ((( test_byte-1 ) & test_byte) == 0) ) ...

von Matthias (Gast)


Lesenswert?

If(testbyte > 2) ...

von Matthias (Gast)


Lesenswert?

Matthias schrieb:
> If(testbyte > 2) ...

> 1 natürlich

von Nicht"Gast" (Gast)


Lesenswert?

Matthias schrieb:
> If(testbyte > 2) ...

Das ist falsch. Wenn mehr als 1 bit gesetzt ist, nicht wenn mehr als das 
1. Bit gesetzt ist

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dieselbe Frage findet man hier:

https://stackoverflow.com/questions/28303832/check-if-byte-has-more-than-one-bit-set

Also:
1
if (n & (n - 1) != 0)
2
{
3
    printf("mehr als 1 bit gesetzt\n");
4
}

Beachte das einfache '&' als Bit-Operator.

von throw1@sse-web.de (Gast)


Lesenswert?

>  sobald in einer 8-bit variable
> mehr als 1 der bits gesetzt ist.

// Abfrage ob mindestens 2 Bits gesetzt sind:
if (test_byte > 1)

Kann mich aber auch irren.

von Detlef _. (detlef_a)


Lesenswert?

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Determining if an integer is a power of 2

unsigned int v; // we want to see if v is a power of 2
bool f;         // the result goes here

f = (v & (v - 1)) == 0;

Note that 0 is incorrectly considered a power of 2 here. To remedy this, 
use:

f = v && !(v & (v - 1));
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2

somachendieprofisdas :))))
math rulez.

Cheers
Detlef

PS: Sagte Frank schon, zu spät gesehen, sry.

von Peter D. (peda)


Lesenswert?

Besser lesbare ist switch/case.
Sparsamer ist ne Schleife:
1
bool test_ones(uint8_t val)
2
{
3
  while(1)
4
  {
5
    if (val > 0x80)
6
      return true;             // more than 1 ones
7
    val <<= 1;
8
    if (val == 0)
9
      return false;
10
  }
11
}

von throw1@sse-web.de (Gast)


Lesenswert?

throw1@sse-web.de schrieb:
>>  sobald in einer 8-bit variable
>> mehr als 1 der bits gesetzt ist.
>
> // Abfrage ob mindestens 2 Bits gesetzt sind:
> if (test_byte > 1)
>
> Kann mich aber auch irren.

Ok, ist falsch. Sorry

von Markus H. (markus652)


Lesenswert?

Frank M. schrieb:
> Dieselbe Frage findet man hier:
>
> 
https://stackoverflow.com/questions/28303832/check-if-byte-has-more-than-one-bit-set
>
> Also:
>
1
> if (n & (n - 1) != 0)
2
> {
3
>     printf("mehr als 1 bit gesetzt\n");
4
> }
5
>
>
> Beachte das einfache '&' als Bit-Operator.


vielen Dank Frank, funktioniert perfekt :)

Beitrag #6069554 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.