Jak odczytywać i zapisywać pojedyncze bity w zmiennej int 7236 6

O temacie

Autor RafalBudzis

Zaczęty 30.06.2012 roku

Wyświetleń 7236

Odpowiedzi 6

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Zmienna int czyli integer zapisuje liczby korzystając z 32 bitów. Jeśli chcemy zapisywać tylko wartości logiczne (TRUE/FALSE) możemy skorzystać z jednego inta do całego moda (zamiast robić 32 zmienne int wystarczy nam jedna).

Napisałem 2 funkcje trochę je testowałem ale tylko na 2 liczbach w kilku kombinacjach wiec nie mam 100 % pewności ze wszystko działa.

func int getbool(var int zmienna,var int pozycja_bitu){

        var int b;
b = zmienna << (32 - pozycja_bitu);

if (b < 0){
return 1;
}else{
return 0;
};

};


func int setbool(var int zmienna,var int pozycja_bitu,var int wartosc){

if (wartosc == 1){
return zmienna|(wartosc << (pozycja_bitu-1));
};

if (wartosc == 0){
return ~((~zmienna)|(1 << (pozycja_bitu-1)));
};
};


Teraz jak je wykorzystać ? Przykładowo skorzystamy tylko z 4 pierwszych pozycji. Zapiszemy prawda, fałsz, fałsz, prawda.

ZAPISYWANIE
var int super_zmienna;

super_zmienna = setbool(0,1,TRUE);//pierwszy parametr (0) oznacza wartość do której będzie dopisywana wartość logiczna
//0 - zerowanie zmiennej
//drugi parametr(1) określa pozycje bitu
//trzeci parametr(TRUE) określa wartość logiczna do zapisania

super_zmienna = setbool(super_zmienna,2,FALSE);//przy kolejnych pierwszym parametrem jest zmienna bo teraz dopisujemy bity do tego co już zapisalismy w tej zmiennej
super_zmienna = setbool(super_zmienna,3,FALSE);
super_zmienna = setbool(super_zmienna,4,TRUE);

ODCZYTYWANIE

Z tym chyba nikt nie powinien mieć problemu podajemy zmienną i pozycje do odczytania.

getbool(super_zmienna,4);//zwróci nam TRUE bo na 4 pozycji taką właśnie wartość zapisaliśmy.
getbool(super_zmienna,1);//to tez TRUE
getbool(super_zmienna,3);//FALSE
getbool(super_zmienna,2);//FALSE

o wszystkich nie powodzeniach i nie działających wypadkach piszcie.

Dla was ma nie być pozycji zero !!! :P
Przy odczycie 0 to 32 pozycja
Przy zapisie 0 to pozycja -1 więc będą błędy.

Do określania pozycji wartości używajcie liczb z zakresu od 1 do 32.


EDIT : Skrypty Lehona są lepsze (4 post) więc korzystajcie z nich działają na tej samej zasadzie z tą różnicą ze pozycje podajemy w zakresie od 0 do 31.

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
może jestem ignorantem, ale "A po co to? Komu to potrzebne? Ale dlaczego?" Nie można użyć po prostu tablicy booli?

Aj. Nie zauważyłem, że ten "nowy topic" jest w dziale od goticzka... Goticzek nie ma wsparcia tablic?
 
Popisuje się ciągle menda jedna...

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Aj. Nie zauważyłem, że ten "nowy topic" jest w dziale od goticzka... Goticzek nie ma wsparcia tablic?
Niby ma ale to kuleje a po 2 gothic ma tylko 3 typy zmiennych (integer, float, String). Nie ma zmiennej boolean.

Lehona

Lehona

Użytkownicy
posty196
Propsy190
  • Użytkownicy
Gothic supports Arrays but has got no boolean type (The only useable primitives are int and string).

The scripts seem to be quite overcomplicated. To get a bit:

func int getBit(var int value, var int pos) { return value & (1<<pos); };Where 0 would be the lowest bit and 31 the highest.

To set a bit:
func int setBit(var int value, var int pos, var int b) {
if (b) {
    return value | (1<<pos);
} else {
    return value &~ (1<<pos);
};
Again, 0 is the lowest bit and 31 the highest.

Edit: Made setBit() slightly shorter

Edit2: If you're really into efficient functions:
func int setBit(var int value, var int pos, var int b) {
    return (value & ~(1 << pos)) | (!!b << pos);
};
 
Unless specified otherwise, my posts are always about Gothic 2 Night of the Raven.

Lehona

Lehona

Użytkownicy
posty196
Propsy190
  • Użytkownicy
The only thing Gothic is lacking in this case is type safety - other languages don't necessarily implement boolean as 1bit-values :)

And nowadays most basic things can be achieved just as in languages like C :)
Also, I'm working on a new parser, that might help out a little bit more, when (or, if) I get done :)
 
Unless specified otherwise, my posts are always about Gothic 2 Night of the Raven.

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy
Co umiejetnosci skryptera maja do rzeczy? Wszedzie mozna uzywac inta jako boola, tylko po co?
Co jest trudnego w robieniu czegos bez uzycia booli? Nic. Po prostu konieczne jest wtedy uzywanie intow pelniacych funkcje booli.
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Co umiejetnosci skryptera maja do rzeczy? Wszedzie mozna uzywac inta jako boola, tylko po co?
Co jest trudnego w robieniu czegos bez uzycia booli? Nic. Po prostu konieczne jest wtedy uzywanie intow pelniacych funkcje booli.

no można, tyle, że to argument w stylu "Po co komu polimorfizm, skoro można programować w assemblerze" ;)
 
Popisuje się ciągle menda jedna...


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry