Avatar
Libor Novák
Člen
Avatar
Libor Novák:13. září 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. září 12:07
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na Libor Novák
Luboš Satik Běhounek:13. září 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. září 13:00
https://www.facebook.com/peasantsandcastles/
Avatar
Martin Petrovaj
Překladatel
Avatar
Odpovídá na Libor Novák
Martin Petrovaj:13. září 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. září 13:15
Nahoru Odpovědět 13. září 13:13
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Libor Novák
Člen
Avatar
Libor Novák:13. září 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. září 13:25
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Libor Novák
ostrozan:16. září 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. září 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.