www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 
Sponsored by SiOL

Kako se v Pythonu najlepše manipulira s biti v bajtu

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Raspberry Pi sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.80
Kraj: Dragomer

PrispevekObjavljeno: Ned Jul 21, 2019 10:36 am    Naslov sporočila:  Kako se v Pythonu najlepše manipulira s biti v bajtu Odgovori s citatom

Običajno rad upravljam naprave preko i2c portexpanderja. definiram nek bajt in za posamezne bite tega bajta definiram aliase. V Bascomu je to zelo preprosto:
Koda:
dim pcfbajt as byte
rele3 alias pcfbajt.3  ' in tako še ostale bite

In tako enostavno lahko testiram vsebino vsakega bita posebej in tudi upravljam vsak bit posebej.
Koda:
rele3 = 1
i2csend pcfbajt


Kako nekaj takega najpreprosteje in z čim manj kode naredim v Pythonu?
Sem iskal kak ukaz ki bi bil analogen bascovemu alias a nisem našel.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Riven
Član
Član



Pridružen-a: Ned 16 Dec 2012 18:33
Prispevkov: 181
Aktiv.: 2.20
Kraj: Vitanje

PrispevekObjavljeno: Ned Jul 21, 2019 3:41 pm    Naslov sporočila:   Odgovori s citatom

https://wiki.python.org/moin/BitManipulation
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.80
Kraj: Dragomer

PrispevekObjavljeno: Ned Jul 21, 2019 3:53 pm    Naslov sporočila:  Hvala, poučna stran, Odgovori s citatom

Riven je napisal/a:
https://wiki.python.org/moin/BitManipulation


Sedaj je treba to še naštudirati.
Ampak že vidim: Bascom veliko preprostejši.

Vilko

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.80
Kraj: Dragomer

PrispevekObjavljeno: Ned Jul 21, 2019 5:06 pm    Naslov sporočila:   Odgovori s citatom

Mislim, da bom delal takole:

Koda:
#      definiram pomožne spremenljivke
bit1 = 0x01
bit2 = 0x02
bit3 = 0x04
bit4 = 0x08
bit5 = 0x10
bit6 = 0x20
bit7 = 0x40
bit8 = 0x80

#      defniram spremeljivko bajt
bajt = 0
print (bin(bajt))
#      v spremenljivki bajt dvignem bit 3
bajt = bajt + bit3
print (bin(bajt))
#      v spremenljivki bajt dvignem še bit 6
bajt = bajt + bit6
print (bin(bajt))
#      v spremenljivki bajt zrušim  bit 3
bajt = bajt - bit3
print (bin(bajt))
#      bite lahko dvigam z or
bajt = bajt | bit3
print (bin(bajt))
#      in rušim z and, le da pri tem moram
#      uporabiti komplement
bajt = bajt & (255 - bit3)
print (bin(bajt))
#      bit lahko tudi testiram
if ((bajt & bit3) > 0 ):
    print ("Bit 3 je 1")
else:   
    print ("Bit 3 je 0")

print ("KONEC")


Razlaga: Definiral si bom pomožne spremenljivke od bit0 do bit 7 in z njimi delal operacije na spremenljivki bajt. Kar me še moti je print ukaz, ki odreže ničle izpred prvega bita.
Rezultat gornjega programa je sledeč:
Koda:
0b0
0b100
0b100100
0b100000
0b100100
0b100000
Bit 3 je 0
KONEC


V programu, ki upravlja naprave bom seveda pomožne spremenljivke imenoval drugače recimo:

motor1 = 0x01
motor_roleta1_gor = 0x02
motor_roleta1_dol = 0x04
lučdvorišča = 0x08

In tako dalje. Ostane mi samo še, da vsebino spremenljivke bajt, ki jo bom verjetno poimenoval kot i2cbajt, pošljem na i2cbus

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3566
Aktiv.: 22.62
Kraj: Krško

PrispevekObjavljeno: Ned Jul 21, 2019 9:02 pm    Naslov sporočila:   Odgovori s citatom

Za postavljanje bita na 0 ne smeš uporabiti
bajt = bajt - bit3 , saj bo prišlo do prenosa, če je bit3 že enak 0.

Uporabi definicije
NiBit0 = 0xfe
Nibit1 = 0xfd
...
Torej maske iz enic in ene ničle (1111 1110, 1111 1101, ...).

Potem pa
bajt = bajt & NiBit3
z AND funkcijo izklopiš posamezen bit.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Riven
Član
Član



Pridružen-a: Ned 16 Dec 2012 18:33
Prispevkov: 181
Aktiv.: 2.20
Kraj: Vitanje

PrispevekObjavljeno: Pon Jul 22, 2019 8:03 am    Naslov sporočila:   Odgovori s citatom

Tako kot je že iGo napisal, način kot je tisti, ne smeš uporabiti.
Zakaj enostavno ne napišeš funkcije, ki ti maskira bit, setira bit, ali resetira bit?

Primer (ki je bdw. tudi na linku ki sem ga dodal):
maska = 1 << st_mest (s to masko potem setiraš bit, pogledaš če je na 0, ali ga resetiraš?)

To potem vkljucis v funkcijo in lahko s tem delas kar zelis. Ne potrebuješ odkrivati tople vode, ker je v tem primeru že odkrita.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.80
Kraj: Dragomer

PrispevekObjavljeno: Sre Jul 24, 2019 5:52 pm    Naslov sporočila:   Odgovori s citatom

Ja, razumem. Samo and in or prideta v poštev in ne plus in minus.
_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Raspberry Pi sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 146 dni


Powered by phpBB © 2001, 2005 phpBB Group