Java týden Java týden
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě

Diskuze: Zápis bitu do byte

C# .NET .NET (C# a Visual Basic) Zápis bitu do byte American English version English version

Aktivity (3)
Avatar
Libor Novák
Člen
Avatar
Libor Novák:13.9.2018 12:07

Ahoj, chtel bych poprosit o radu zkusenejsich C# programatoru ... Zivim se jako programmator PLC a nyni delam aplikaci ve Windows, ktera bude posilat nejaka data do PLC pres PROFINET (prumyslovy robot). Potreboval bych v promenne typu byte editovat jednotlive bity (setovat/rese­tovat). Cteni jsem zvladnul ((aByte >> no_of_bit0) & 1) ale jak na zapis nemohu nikde vygooglit. Predem moc diky. Jen doplnim, ze promenna opravdu musi by typu byte, ne pole boolean nebo podobne reseni.

 
Odpovědět 13.9.2018 12:07
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Libor Novák
Luboš Běhounek Satik:13.9.2018 13:00

Prvni co me napadlo asi takhle, snad jsem to napsal dobre (nezkousel jsem to), origValue je hodnota, do ktery to chces zapsat, bitValue je 1 nebo 0 a pos je pozice bitu od konce, mozna to jde i nejak jednodusejc, ale nemam ted moc cas ted nad tim nejak vic premyslet :)

int writeBit(byte origValue, byte bitValue, byte pos)
{
  // vynulovat misto, kam bit prijde
  origValue = origValue & ~(1 << pos);
  // zapsat bit
  origValue = origValue | (bitValue << pos);
  return origValue;
}
Nahoru Odpovědět 13.9.2018 13:00
https://www.facebook.com/peasantsandcastles/
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Libor Novák
Martin Petrovaj:13.9.2018 13:13

Ak by mi nenapadlo nič iné, tak by som použil jednoduchú matematiku. Existuje implicitná konverzia medzi typom byte a väčšinou číselných typov. Nastaviť n-tý bit s hodnotou 0 na 1 môžeš tým, že obsah premennej typu byte prenásobíš 2n. Opačný efekt dosiahneš logicky delením.

byte x = 0b10;
x = (byte)(x + 2*4);
Console.WriteLine(Convert.ToString(x, 2));
// output: 1010

Nie je to pekné a fungovalo by aj použitie bitwise operátorov, ale je to krátke, čitateľné a funguje to.

Editováno 13.9.2018 13:15
Nahoru Odpovědět 13.9.2018 13:13
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Libor Novák
Člen
Avatar
Libor Novák:13.9.2018 13:25

Diky panove, spojil jsem oba prispevky a mam to :)

byte writeBit(byte origValue, byte bitValue, byte pos)
{
// vynulovat misto, kam bit prijde
origValue = (byte)(origValue & ~(1 << pos));
// zapsat bit
origValue = (byte)(origValue | (bitValue << pos));
return origValue;
}

 
Nahoru Odpovědět 13.9.2018 13:25
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Libor Novák
ostrozan:16.9.2018 21:09

Pánové přede mnou "vymýšlejí kolo" :)
C# má třídy na (skoro) všechno.
A ta pro tebe se jmenuje "Bit Array ":https://docs.microsoft.com/…ons.bitarray?…
Ale samozřejmě Lubošovo typicky Céčkové řešení funguje.

 
Nahoru Odpovědět  -1 16.9.2018 21:09
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.