QB64 Phoenix Edition
Bite operations with ShL and ShR - Printable Version

+- QB64 Phoenix Edition (https://qb64phoenix.com/forum)
+-- Forum: QB64 Rising (https://qb64phoenix.com/forum/forumdisplay.php?fid=1)
+--- Forum: Prolific Programmers (https://qb64phoenix.com/forum/forumdisplay.php?fid=26)
+---- Forum: Petr (https://qb64phoenix.com/forum/forumdisplay.php?fid=52)
+---- Thread: Bite operations with ShL and ShR (/showthread.php?tid=3215)



Bite operations with ShL and ShR - Petr - 11-16-2024

This demo doesn't focus on reading Byte directly, but shows how to do the same job more easily using _ShL and ShR bit shifting. It took me a while to figure out how to use it, but I thought we could share our experiences with reading bit values from Byte here.

Code: (Select All)

'_ShL, _ShR - how place info to byte and then read it back

GameTyp = 2 ' is needed 2 bites
MaskTyp = 6 ' is needed 4 bites
TimeH = 20 '  is needed 5 bites
TimeM = 44 '  is needed 6 bites
TimeS = 33 '  is needed 6 bites


Print "writing to bytes this values:"
Print "Seconds:"; TimeS
Print "Minutes:"; TimeM
Print "Hours:"; TimeH
Print "Mask:"; MaskTyp
Print "GameTyp:"; GameTyp

Dim msk As Long '32 bite, but here is used 23 bites only


'why GameTyp bite lenght is 2?          Is needed here store values 0 to 3. For this are 2 bites enought, in two bites can be stored values 0, 1, 2, 3
'why MaskTyp bite lenght is 4?          Is needed here store 16 values. To 4 bite can be stored values 0 to 15 (16 values total)
'why TimeH bite lenght is 5?            TimeH is for saving hours. To 5 bites can be stored 32 values (0 to 31)
'why TimeM and TimeS bite lenght is 6?  TimeM save minutes and TimeS save seconds. Both are values 0 to 60. To 6 bites can be stored value 0 to 63.


'output 4 bytes structure (LONG is 4 byte value):

'    Variable          GameTyp  MaskTyp  TimeH  TimeM  TimeS
'    Bite Lenght          2      4        5      6      6
'Position in BYTE:      23      21      17    12      6

'write values to Bytes:
msk = msk Or _ShL(GameTyp, 21) '      it is always necessary to shift the bit value to the position as it will be stored in the byte (see above)
msk = msk Or _ShL(MaskTyp, 17)
msk = msk Or _ShL(TimeH, 12)
msk = msk Or _ShL(TimeM, 6)
msk = msk Or TimeS

msk2 = msk
_ControlChr Off
Print
Print "All values writed as"; msk; "("; MKL$(msk); ")"
Print
Print "Reading values from this bytes"
'now - read values back from created msk value:

TimeSec = msk And 63 ' read 6 bites    (63 is 00111111)
msk = _ShR(msk, 6) '  shift bites right up 6 bite
TimeMin = msk And 63 ' read 6 bites
msk = _ShR(msk, 6) '  right bites up 6 bite
TimeHrs = msk And 31 ' read 5 bites    (31 is 00011111)
msk = _ShR(msk, 5) '  shift bites right up 5 bites
Mtyp = msk And 15 '    read 4 bites    (15 is 00001111)
msk = _ShR(msk, 4) '  shift bites right up 4 bites
Gtyp = msk And 3 '    read 2 bites    (3 is 00000011)

Print "Seconds:"; TimeSec
Print "Minutes:"; TimeMin
Print "Hours:"; TimeHrs
Print "Mask:"; Mtyp
Print "GameTyp:"; Gtyp



RE: Bite operations with ShL and ShR - ahenry3068 - 11-16-2024

Its good code.    And I've been playing with similar techniques to pack RAM more tightly on the X16 a neo-retro 8 bit computer.    However,  I can't see why would ever need this technique on even a barely modern system.    It's seems kind of a waste for a relatively small RAM savings.     

   No offense meant.   It is quite nice code actually.    IMO I just don't see the point.   Wink.


RE: Bite operations with ShL and ShR - Petr - 11-16-2024

(11-16-2024, 09:34 PM)ahenry3068 Wrote: Its good code.    And I've been playing with similar techniques to pack RAM more tightly on the X16 a neo-retro 8 bit computer.    However,  I can't see why would ever need this technique on even a barely modern system.    It's seems kind of a waste for a relatively small RAM savings.     

   No offense meant.   It is quite nice code actually.    IMO I just don't see the point.   Wink.

What's the point? Huge. Just read the documentation for MP3 or MP4 format, for GIF format, also for TTF font files, for 1-bit bitmaps and so on. Bit fields need to be decoded everywhere, it's a perfectly common practice.


RE: Bite operations with ShL and ShR - SMcNeill - 11-16-2024

(11-16-2024, 09:34 PM)ahenry3068 Wrote: Its good code.    And I've been playing with similar techniques to pack RAM more tightly on the X16 a neo-retro 8 bit computer.    However,  I can't see why would ever need this technique on even a barely modern system.    It's seems kind of a waste for a relatively small RAM savings.     

   No offense meant.   It is quite nice code actually.    IMO I just don't see the point.   Wink.

The point is to use a variable for bit-packing.   In this case though, I personally think I'd just use a custom type and save myself a lot of shifting and headache.

TYPE msl_type
    game as _byte
    mask as _byte
    hour as _byte
    minute as _byte
    second as _byte
END TYPE

5 bytes with each to use, access, and something everyone can understand at a glance.   Compared to 4 bytes which is rather complex for a lot of folks to ever sort out and work with.

Trust me, I can promise you which one is easiest to come back to and work on after a 2 year break or whatnot. Smile

(11-16-2024, 10:28 PM)Petr Wrote:
(11-16-2024, 09:34 PM)ahenry3068 Wrote: Its good code.    And I've been playing with similar techniques to pack RAM more tightly on the X16 a neo-retro 8 bit computer.    However,  I can't see why would ever need this technique on even a barely modern system.    It's seems kind of a waste for a relatively small RAM savings.     

   No offense meant.   It is quite nice code actually.    IMO I just don't see the point.   Wink.

What's the point? Huge. Just read the documentation for MP3 or MP4 format, for GIF format, also for TTF font files, for 1-bit bitmaps and so on. Bit fields need to be decoded everywhere, it's a perfectly common practice.

It's also not just for modern formats.  Even old-school graphics did this with bit packing for black/white screens.   Screen 7(I think) packs it's memory into 4-bit nibbles (half-bytes).   It's not rare at all to see this type of thing in use with more advanced code and projects.  Smile


RE: Bite operations with ShL and ShR - ahenry3068 - 11-16-2024

(11-16-2024, 10:30 PM)SMcNeill Wrote:
(11-16-2024, 09:34 PM)ahenry3068 Wrote: Its good code.    And I've been playing with similar techniques to pack RAM more tightly on the X16 a neo-retro 8 bit computer.    However,  I can't see why would ever need this technique on even a barely modern system.    It's seems kind of a waste for a relatively small RAM savings.     

   No offense meant.   It is quite nice code actually.    IMO I just don't see the point.   Wink.

The point is to use a variable for bit-packing.   In this case though, I personally think I'd just use a custom type and save myself a lot of shifting and headache.

TYPE msl_type
    game as _byte
    mask as _byte
    hour as _byte
    minute as _byte
    second as _byte
END TYPE

5 bytes with each to use, access, and something everyone can understand at a glance.   Compared to 4 bytes which is rather complex for a lot of folks to ever sort out and work with.

Trust me, I can promise you which one is easiest to come back to and work on after a 2 year break or whatnot. Smile

(11-16-2024, 10:28 PM)Petr Wrote:
(11-16-2024, 09:34 PM)ahenry3068 Wrote: Its good code.    And I've been playing with similar techniques to pack RAM more tightly on the X16 a neo-retro 8 bit computer.    However,  I can't see why would ever need this technique on even a barely modern system.    It's seems kind of a waste for a relatively small RAM savings.     

   No offense meant.   It is quite nice code actually.    IMO I just don't see the point.   Wink.

What's the point? Huge. Just read the documentation for MP3 or MP4 format, for GIF format, also for TTF font files, for 1-bit bitmaps and so on. Bit fields need to be decoded everywhere, it's a perfectly common practice.

It's also not just for modern formats.  Even old-school graphics did this with bit packing for black/white screens.   Screen 7(I think) packs it's memory into 4-bit nibbles (half-bytes).   It's not rare at all to see this type of thing in use with more advanced code and projects.  Smile
  Ahh.  Ok I stand corrected.   I just didn't get the context for the code.      I didn't think of decoding packed file formats at all.   I've been using bit packed variables to save memory and that's what I thought of first...     I'll think twice next time.


RE: Bite operations with ShL and ShR - Pete - 11-17-2024

No worries. A lot of folks think my routines are worthless until I come back to explain them and prove them to be worthless.

Pete Big Grin

- I don't give two shifts about a bit.


RE: Bite operations with ShL and ShR - PhilOfPerth - 11-17-2024

(11-17-2024, 01:31 AM)Pete Wrote: No worries. A lot of folks think my routines are worthless until I come back to explain them and prove them to be worthless.

Pete Big Grin

- I don't give two shifts about a bit.

I bet my routines are worthlesser than your routines!


RE: Bite operations with ShL and ShR - Pete - 11-19-2024

Ya mean MORE worthlesser, varmint! Big Grin

Howdy ya xpect folks who visit here ta larn Inglish?

 - Sam