forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Запаковка флагов в один байт. (http://forum.boolean.name/showthread.php?t=2465)

HolyDel 21.01.2007 01:47

Запаковка флагов в один байт.
 
Все что будет здесь написанно в основном касается программирования сетевых игр.

Иногда надо передать информацию весьма сжато, особенно если эта информация типа boolean (0/1). Ну например мочить своих/нет, использовать мины/нет и т.д.
вот пример как ету инфу запокавать в один байт. потом его можно chr командой привести к одной букве и отпрваить ее по сети, радуясь экономии трафика.
Код:

b=PackFlagsToByte(1,1,1,0,0,1,1,0)

For i=0 To 7
        Write(ub(b,i))
Next
WaitKey


Function PackFlagsToByte%(f0,f1,f2,f3,f4,f5,f6,f7)
        If f0<0 Then f0=0
        If f0>1 Then f0=1       
        If f1<0 Then f1=0
        If f1>1 Then f1=1
        If f2<0 Then f2=0
        If f2>1 Then f2=1
        If f3<0 Then f3=0
        If f3>1 Then f3=1
        If f4<0 Then f4=0
        If f4>1 Then f4=1
        If f5<0 Then f5=0
        If f5>1 Then f5=1
        If f6<0 Then f6=0
        If f6>1 Then f6=1
        If f7<0 Then f7=0
        If f7>1 Then f7=1
        rb%=0
        rb=f0 Shl 7+f1 Shl 6+f2 Shl 5+f3 Shl 4+f4 Shl 3+f5 Shl 2+f6 Shl 1+f7
        Return rb
End Function

Function ub%(b_%,bit)
        bit=7-bit
        Return (b_ Shr bit) Mod 2
End Function


jimon 21.01.2007 11:57

Re: Запаковка флагов в один байт.
 
1) как я помню блиц держит параметры функции по дефолту
потому лутче бы в функции PackFlagsToByte
все параметры кроме первого по дефолту поставить 0
вдруг юзеру захочется не 8 флагов записать, а 3 или 5 ?

2) имхо в той функции не нужны проверки
пусть если юзер намудачит то прога крешит
а то потом будет читать ети флаги - ему вместо 3 возвращает 1
и он будет думать долго ... :)

HolyDel 22.01.2007 02:42

Re: Запаковка флагов в один байт.
 
Jimon, хорошие идеи
Код:

Function PackFlagsToByte%(f0,f1=0,f2=0,f3=0,f4=0,f5=0,f6=0,f7=0).
        rb=f0 Shl 7+f1 Shl 6+f2 Shl 5+f3 Shl 4+f4 Shl 3+f5 Shl 2+f6 Shl 1+f7
        Return rb
End Function


impersonalis 11.12.2008 12:23

Ответ: Запаковка флагов в один байт.
 
2HolyDel & jimon
спасибо


Часовой пояс GMT +4, время: 04:32.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot