Na crowdsourcingové platformě Crowd Supply byla spuštěna kampaň na podporu open source biometrického monitoru ve tvaru hodinek HealthyPi Move. Cena je 249 dolarů a plánovaný termín dodání listopad letošního roku.
Firma Murena představila /e/OS verze 2.0. Jde o alternativní sestavení Androidu bez aplikací Google. Mezi novinkami je podrobnější nastavení ochrany soukromí před sledováním aplikacemi. Murena prodává několik smartphonů s předinstalovaným /e/OS (Fairphone, repasovaný Google Pixel 5).
Do 30. května lze v rámci akce Warhammer Skulls 2024 získat na Steamu zdarma hru Warhammer 40,000: Gladius - Relics of War.
HelenOS (Wikipedie), tj. svobodný operační systém českého původu založený na architektuře mikrojádra, byl vydán ve verzi 0.14.1. Přehled novinek v poznámkách k vydání. Vypíchnou lze nabídku Start. Videopředstavení na YouTube.
BreadboardOS je firmware pro Raspberry Pi Pico (RP2040) umožňující s tímto MCU komunikovat pomocí řádkového rozhraní (CLI). Využívá FreeRTOS a Microshell.
Vývojáři KDE oznámili vydání balíku aplikací KDE Gear 24.05. Přehled novinek i s náhledy a videi v oficiálním oznámení. Do balíku se dostalo 5 nových aplikací: Audex, Accessibility Inspector, Francis, Kalm a Skladnik.
Byla vydána (𝕏) nová verze 18.0.0 open source webového aplikačního frameworku Angular (Wikipedie). Přehled novinek v příspěvku na blogu.
V neděli 26. května lze navštívit Maker Faire Rychnov nad Kněžnou, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.
Byla vydána nová stabilní verze 3.20.0, tj. první z nové řady 3.20, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie) postavené na standardní knihovně jazyka C musl libc a BusyBoxu. Z novinek lze vypíchnou počáteční podporu 64bitové architektury RISC-V.
Bit offset ... 76 80 84 88 92 96 100 104 108 ...
Char boundaries | |-----1-----|-----2-----|-----3-----|-----4-----| |
Bits in byte order 0010 1010 0001 0111 0001 0011 0000 0011 0000 0010
Bits in bit field order 0101 0100 1110 1000 1100 1000 1100 0000 0100 0000
Char bits in byte order 0111 0010 0011 0001 0011 0001 0010 0000
Hex vals of char bits 7 2 3 1 3 1 2 0
Char val of char bits 'r' '1' '1' ' '
a makro, které to načtení provede : (taky jen odhaduju, co to vlastně dělá - nějaké bitové posuny, masky ale jen hádám )
#define read_bits(data,start,size) \
((*((uint64_t*) &(data)[(start) / 8]) >> ((start) & 7)) & (((uint64_t)1 << (size)) - 1))
Osvětlil by mi někdo, co to makro jako dělá ? Tedy tápu, proč je tam uint64_t a hvězdička u toho na začátku, možná je to vymezení typu, se kterým se bude to šibování provádět, ale jako jsem z toho mimo
Děkuji za výklad....
Řešení dotazu:
Ty explicitně napsané bitové operace vypadají složitější, než je nutné.
C i C++ mají bitfield (struct
s dvojtečkami). Tím by se možná dalo něco zjednodušit. (Ne pokud tam je nějaká hodně netriviální transformace nebo komprese, nicméně pokud jde o extrakci / ukládání některých specifických bitů ve dlouhém řetězci bitů, tam bitfield opravdu hustě pomáhá.)
Co se Pythonu týká, asi bych tu funkci pro manipulaci s bity sesmolil v C nebo C++ a pak zpřístupnil přes SWIG v Pythonu.
def read_bits(data, start, size):
return ((int.from_bytes(data[start // 8:], 'big') >> (start % 8)) & ((1 << size) - 1))
Rather than describe everything in terms of byte offsets, I'm going to define the layout as a series of variable-length bit fields. This is a critical part of the item format, because the position of many of the fields can change depending on what comes before it. If I say a certain value is a 3-bit field starting at bit position 150, for example, this translates to bits 6 and 7 of the byte 18 and bit 0 of byte 19 in the data structure. You can read an arbitrary bit field programatically using the following code (in C): #define read_bits(start,size) \ ((*((unsigned long *) &data[(start) / 8]) >> ((start) & 7)) & ((1 << (size)) - 1))
17 18 19 ........|......xx|x.......|... ->(start) & 7 -- zjistim offset 8 & 7 = 0, 9 & 7 = 1 .. 150 & 7 = 6
........|......xx|x.......|... -> 67|0(&data[(start) / 8]) >> ((start) & 7) -- posunu se na zacatek
........|......xx|x.......|... ->67|0((1 << (size)) - 1) -- pripravim si "masku" 1 << 3 = 8 - 1 = 7 0x00000111 - chci tri bity
........|......xx|x.......|... ->67|0((&data[(start) / 8]) >> ((start) & 7)) & ((1 << (size)) - 1)) -- Vyctu tri bity. Pytnon cte data po celych bytech a musel by si vyresit to "prekrivani" se hodnot..
Tiskni Sdílej: