Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Operatory bitowe PHP/C
scanner
post
Post #1





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Ludzie, ja wiem, że jest poźno, ale zacznijcie czytać tego manuala. Ciągniecie wątek pisząc coś, co nie jest prawdą.

Od kiedy w php znak "^" to potega? Według mnie i manuala:
Cytat
Operatory bitowe służą do operowania na wartościach konkretnych bitów w liczbie. Jeśli zarówno lewo jak i prawostronne operandy są typu string, operatory bitowe będą wykonywać operacje na poszczególnych znakach tych łańcuchów.  


$a ^ $b
Sumowanie bitowe modulo 2
Dany bit wynikowy jest równy 1 wtedy i tylko wtedy, kiedy jeden z bitów składowych jest równy 1 a drugi jest równy 0.

A jeśłi mnie moja przemęczona głowa nie myli to:
[php:1:d06f1d6bf9]<?php
$a = $a ^ $b
// jest równoznaczne z
$a ^= $b
?>[/php:1:d06f1d6bf9]

Przypominam także o: [php:1:d06f1d6bf9]<?php echo sprintf("Dwójkowo: %b", 123); ?>[/php:1:d06f1d6bf9]
Go to the top of the page
+Quote Post
scanner
post
Post #2





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Cytat
To wytłumacz jeszcze (...)

Kod
Bitowo:



00000001 ^ 00000001 = 00000000

10101010 ^ 10101010 = 00000000

10101010 ^ 01010101 = 11111111

00011000 ^ 00110011 = 00100011
Już jasne ?
Go to the top of the page
+Quote Post
5z474n
post
Post #3





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 2.05.2003

Ostrzeżenie: (0%)
-----


co w C++ znaczy:
Kod
b = (a >> 24) | (a << 8);

i
Kod
va_list ap;

va_start(ap, format);

va_arg(ap, unsigned char*)



:cry:
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #4





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


Opłaca się studiować informatykę: (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

ptaszek to XOR

Jak nie wiecie co to XOR to tu przykład

1 XOR 1 =0
1 XOR 0 =1
0 XOR 1 = 1
0 XOR 0 = 0

Czyli jeżeli mamy dwa różne bity to XOR na nich daje 1, jeżeli są równe daje zero.

Bardziej "rozbudowane":
11110000111100000000 XOR 00001111000011110000 = 11111111111111110000
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #5





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


operatory >> oraz << służą do przesunięcia bitów w prawo/lewo.

Na przykład 10>>1=1
1<<1=10
1<<4=10000
Operator | oznacza bitowe or czyli bitowe dodawanie
Bitowe dodawanie to coś takiego co daje wynik zero jeśli obydwa bity są równe zero, w każdym innym wypadku daje jeden

Na przykład 110000 | 000001 = 110001

P.S.
Była omyłka (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #6





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


Na takie pytania wyrwane z kontekstu ciężko się odpowiada

Wyrażenie :
Kod
b = (a >> 24) | (a << 8);

Robi po kolei
Przesuwa bitowo wartość zmiennej a w prawo o 24 miejsca, przesuwa bitowo wartość zmiennej a w lewo a następnie sumuje otrzymane liczby bitowo i przypisuje wynik zmiennej b. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Cytat
va_list structure Used to hold information needed by va_arg and va_end macros. Called function declares variable of type va_list that can be passed as argument to another function.  


P.S.
Ale wpadka (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Jabol
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


ze względu na sporą niewiedzę ludzi na forum o operatorach bitowych postanowiłem przykleić go na pewien czas (dokładnie do dzisiaj wieczorem). Teraz jeszcze tylko dodatek o innych operatorach bitowych:

| -sumowanie bitowe
0 | 0 = 0
0 | 1 = 1
1 | 1 = 1

& -mnożenie bitowe
0 & 0 = 0
0 & 1 = 0
1 & 1 = 1

negacja bitowa
~ 0 = 1
~ 1 = 0
Go to the top of the page
+Quote Post
5z474n
post
Post #8





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 2.05.2003

Ostrzeżenie: (0%)
-----


Kod
int gg_http_hash(const char *format, ...)

{

    unsigned int a, c;

    va_list ap;

    int b = -1, i, j;



    va_start(ap, format);



    if (!format)

  return 0;

    

    for (j = 0; j < strlen(format); j++) {

  unsigned char *arg, buf[16];



  if (format[j] == 'u') {

     snprintf(buf, sizeof(buf), "%d", va_arg(ap, uin_t));

     arg = buf;

  } else {

     if (!(arg = va_arg(ap, unsigned char*)))

    arg = "";

  }    



  i = 0;

  while ((c = (int) arg[i++]) != 0) {

     a = (c ^ b) + (c << 8);

     b = (a >> 24) | (a << 8);

  }

    }



    return (b < 0 ? -b : b);

}


prosze oto calosc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #9





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


O boże a po co ci to? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Jabol
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


Cytat
1<<4=1000
chyba
1<<4=10000, jedno zero w tą czy w tą, ale zawsze sie liczy
Go to the top of the page
+Quote Post
5z474n
post
Post #11





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 2.05.2003

Ostrzeżenie: (0%)
-----


zeby obliczyc hash dla adresu e-mail, hasla przy rejestrowaniu nowych nr gg a mam ta funkcje tylko w C++ i nei moge sobie poradzic z przelozeniem tego na php :mrgreen: bo wogole nie kumam C++ jest to moj pierwszy kontakt z tym jezykiem :]
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #12





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


No dobra...

Ostrzegam, jestem początkującym programistą i to może być wielka pomyłka (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Proszę się nie śmiać jak ktoś zna C++, jestem jeszcze młodym studentem informatyki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)



[php:1:a7884bbe73]int gg_http_hash(const char *format, ...) //deklaracja funkcji, pierwszy parametr to wskaźnik do stringa, funkcja może mieć opcjonalne parametry
{
unsigned int a, c;
va_list ap;
int b = -1, i, j;

va_start(ap, format); //"przechwytujemy" dodatkowe (opcjonalne) parametry funkcji

if (!format) //jeśli parametr format jest stringiem pustym (a w zasadzie to wskaznikiem na NULL albo zerem ('') funkcja zwraca zero i kończy działanie
return 0;

//jeśli są parametry robimy z nimi różne śmieszne rzeczy.
//poniżej (kawałkami tylko napiszę
//wykonujemy tyle razy jaką długość miał format, deklarujemy wskażnik do stringa i stringa (lub jak kto woli: tablicę znaków)
for (j = 0; j < strlen(format); j++) {
unsigned char *arg, buf[16];
//jeżeli aktualny znak(pod tym indeksem w stringu, bo string to nic innego jak tablica znaków) stringa format jest równy 'u' to:
if (format[j] == 'u') {
// do buf wstawiamy znaki zakończone znakiem końca stringa, liczbę znaków którą opisuje liczba sizeof(buf) (czyli 16*8 bitów), następnie jest formatowanie, po kolejnym przecinku jest źródło czyli pobieramy kolejny przekazany opcjonalny parametr (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
snprintf(buf, sizeof(buf), "%d", va_arg(ap, uin_t));
// w arg zapisujemy to cośmy przed chwilą dostali
arg = buf;
} else {
//jeżeli aktualny argument nie jest znakiem 0 (czyli "") to w arg zapisujemy nic (czyli ""), jeżeli nie był pusty to zostawiamy go
if (!(arg = va_arg(ap, unsigned char*)))
arg = "";
}

i = 0;
//zczytujemy sobie po kolei (po znaku) z arg znaki i robimy z nimi bitowe szaleństwa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
while ((c = (int) arg[i++]) != 0) {
a = (c ^ (IMG:http://forum.php.pl/style_emoticons/default/cool.gif) + (c << 8);
b = (a >> 24) | (a << 8);
}
}
//jeżeli po tym wszytkim b < od zera to zamieniamy je na dodatnie, jeżeli dodatnie to zwracamy je
return (b < 0 ? -b : (IMG:http://forum.php.pl/style_emoticons/default/cool.gif) ;
}[/php:1:a7884bbe73]
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #13





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


Po ludzku, dostajemy do funkcji nieznaną ilość parametrów, znamy tylko (nie jestem pewnien) ilość tych parametrów.

Następnie je zasysamy, po 16(długość buf)*8(długość typu char) bitów, i przemielamy za pomocą różnych operatorów logicznych, jeśli dla aktualnego parametru (tu: miejsce w pamięci) znak w stringu format ma wartość 'u'.
Go to the top of the page
+Quote Post
5z474n
post
Post #14





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 2.05.2003

Ostrzeżenie: (0%)
-----


dzieki! dzieki! ... a teraz zobaczymy co z tym zrobic :]

zapomnialem dodac ze

format... - format kolejnych parametrów ('s' jesli dany parametr jest
ciagiem znaków lub 'u' jesli numerem GG)

ale i tak jest dobzre (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
zrob z tego [ php ] a nei [ code ] to bedzie wyrazniej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) dzieki
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #15





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


Matko święta, naprawdę ci pomogłem?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Dziwne, bo jeszcze nie miałem c++ (jestem dopiero na drugim semestrze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )
Go to the top of the page
+Quote Post
5z474n
post
Post #16





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 2.05.2003

Ostrzeżenie: (0%)
-----


pomogles ... wczesniej wogole ne iwiedzialem co z tym zrobic (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) i co wiekszosc z tych znczkow oznacza (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
spenalzo
post
Post #17





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat
Operatory bitowe służą do operowania na wartościach konkretnych bitów w liczbie.

Sorry za lamerstwo: ale do czego to służy?! Tzn. jakie są konkretne zastosowania tego "czegoś"?
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #18





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


Cytat
zeby obliczyc hash dla adresu e-mail, hasla przy rejestrowaniu nowych nr gg


Za przeproszeniem czytać nie umiesz? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Generalnie chodzi o to że musisz wydobyć jakieś dane a są one znakowo, a ty potrzebujesz konkretnych bitów.

W php to się raczej rzadko przydaje, ale w C, C++ często. Na przykład do obsługi ekranu. Bo tam ustawiasz konkretny bit, a nie np: cały znak (czyli 255 dziesiętnie, FF szesnastkowo, dwójkowo 11111111)

Np: żeby zapisać 4 "opcje" np":
ma kółko/nie ma
ma kierownice/nie ma
ma dach/nie ma
ma siedzenia/nie ma
normalnie potrzebujesz czterech zmiennych.

Ale da się to zrobić jedną zmienną. Po prostu:
0 to niczego nie ma
1 ma kółko, nie ma reszty
2 ma kierownice, nie ma reszty
3 ma kółko, ma kierownice, nie ma reszty
itd.

Ale łatwiej zapisać (wg mnie i innych też (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )
0000 nie ma nic
0001 ma kółko
1001 ma kółko i siedzenia.

jak wyzerować coś? Konkretne miejsce? a prosto, potrzebujesz jedynie "wzorców", a wygląda to tak:

masz ustawione
ustawienia=0000
chcesz żeby były siedzenia, robisz tak:
siedzenia=1000;
nowe=siedzenia|ustawienia;
co więcej: to wyrażenie nie zmieni wartości pozostałych bitów, po prostu masz pewność że na najstarszym bicie będziesz miał 1.

A jak coś sprawdzić? Pomyśl, idę już spać, jak chcesz to dopiszę jutro jeszcze trochę (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
spenalzo
post
Post #19





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat
Za przeproszeniem czytać nie umiesz? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Chodziło mi, żeby ktoś to opisał dokładnie w taki sposób (na prostym przykładzie) jak Ty to zrobiłeś.

Cytat
W php to się raczej rzadko przydaje, ale w C, C++ często.

Teraz widzę że raczej tak :-)

Cytat
Ale łatwiej zapisać (wg mnie i innych też (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )
0000 nie ma nic
0001 ma kółko
1001 ma kółko i siedzenia.

Ale wydaje mi się że w php raczej nie jest konieczne czy potrzebne stosowanie czegoś takiego.

Cytat
A jak coś sprawdzić? Pomyśl, idę już spać, jak chcesz to dopiszę jutro jeszcze trochę (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Może operator &? Nie śmiejcie się proszę!
A wyjaśniania starczy. Już wiem (mniej więcej) o co chodzi. Mam teraz ogólne pojęcie o tym, ale i tak magia, dzięki za wyjaśnienia.
Przydałaby się teraz opcja drukowania.
Go to the top of the page
+Quote Post
mateuszkrzeszowi...
post
Post #20





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 23.04.2003
Skąd: Mysłowice

Ostrzeżenie: (0%)
-----


Co do tego że w php niepotrzebne to nie tak do końca, bo np jeżeli robisz duży projekt a masz ograniczenie pamięci do jakiejśtam wartości to użycie tego sposobu zapisu daje znaczne oszczędności. Ale to musiałby być naprawdę duży projekt.

Dodam, że typ int ma 32 bity, czyli daje możliwość zapisania 32 "opcji". Gdyby zapisywać każdą opcję w osobnej zmiennej typu int to zajętość pamięci = 32*32= 1024 bity czyli 128 bajtów, natomiast w jednej zmiennej byłyby to tylko 4 bajty. Różnica jest i to znaczna (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

P.S.
Jeżeli chcesz/chcecie to przybliże tą tematykę jeszcze dokładniej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

P.P.S.
Pozatem zmiana (wyłączenie wszystkich, włączenie wszystkich itd) takich 32 opcji jeśli są zapisane w 32 zmiennych wymaga 32 przypisań, jeżeli w jednej zmiennej dwójkowo to jest potrzebne tylko jedno przypisanie!
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 08:25