|
|
|
|
Strumenti |
11-09-2009, 16:08 | #1 |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
[C++] Operatori bitwise - come definire il risultato di una operazione !?!
Sera,
oggi mi è capitato per puro caso di ricorrere all'uso degli operatori bitwise e ho avuto una difficoltà. Più che una difficoltà una carenza. Mi spiego meglio: Quando guardai gli operatori bitwise, a loro tempo, ne studiai solo il significato e ho sempre e solo visto esempi diretti sui bit. Oggi li ho usati su variabili intere, passando gli argomenti a una funzione SDL. Precisamente SDL_Init(Uint32 flags). Mi è quindi venuta una illuminazione: provare a realizzare a mia volta una funzione che possa agire come SDL_Init, cioè dirigere il flusso di esecuzione in base al valore ottenuto con l'or bitwise sulle varie macro passate. esempio della funzione SDL con l'OR bitwise: Codice:
SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO); Per sapere quindi il risultato l'unico metodo che conosco (e che ho sempre visto) è quello di convertire direttamente i numeri decimali in binari, eseguire il calcolo e riconvertire in decimale. Quindi vi chiedo: esiste qualche operazione aritmetica per verificare direttamente il risultato decimale di una operazione di bitwise senza dover convertire il numero in binario, eseguire l'operazione e quindi riconvertire in decimale ? Sò che sugli operatori di shift si ottiene così: - per x >> y: x/2^n - per x << y: x*2^n Io mi riferisco ad operazioni utili a me per sapere sempre quale risultato aspettarmi (anche se qualuno potrebbe rispondermi:"semplice,assegna alla variabile la stessa operazione bitwise, in modo da avere automaticamente il suo valore", ed io replicherei "ma voglio saperlo per cultura personale, non perchè ogni volta mi metto a fare i calcoli a mente, anche se non guasterebbe"). Se sapete rispondere anche per lo XOR il NOT, e lo AND, fatevi avanti Buona serata a tutti. [EDIT] Da questo link, deduco che l'unico metodo pratico sia farlo manualmente :s. Ovviamente più che manualmente conviene un software, ma non è questo il punto. Attendo qualcuno che screditi questa tesi.
__________________
La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
Isaac Asimov Ultima modifica di Y3PP4 : 11-09-2009 alle 16:15. |
11-09-2009, 16:31 | #2 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1816
|
Non ho capito cosa intendi di preciso con "verificare manualmente". Di solito e' sufficiente fare un AND del valore passato con il "bit" che vuoi verificare
Ad esempio l'implementationze di SDL_Init potrebbe avere al suo interno qualcosa del genere Codice:
void SDL_Init( int flags ) { if ( flags & SDL_INIT_AUDIO ) // initialize the audio subsystem ... ... }
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
11-09-2009, 16:52 | #3 | |
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Quote:
a = ~b su una stringa di n bit corrisponde all'operazione decimale intera: a = (2^n)-1-b per AND, OR e XOR non mi viene al momento in mente nulla di simile. ciao! british |
|
11-09-2009, 17:02 | #4 |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Passando due interi con un operatore di bitwise non ottengo solo un nuovo valore?
Nel senso che: 25|20 = 29, flags non contiene il solo intero 29? Quindi se faccio come dici un Codice:
if( flags & SDL_INIT_AUDIO ) Per manualmente intendo proprio un calcolo senza l'utilizzo di software, farlo a mente potrebbe essere arduo dato che bisogna convertire il numero in binario, tenere a mente il binario mentre esegui il calcolo con un altro binario e poi dal risultato ritornare a un intero decimale. Quindi manualmente, con carta e penna. Mi interessa per sapere a priori quale risultato otterrò con una operazione di bitwise senza dover "testare" il software... metti che un giorno mi capiterà a lavoro (quando lavorerò) non credo sia bello farsi vedere mentre "provo" qual'è il risultato. Ritornando al metodo da te consigliato: perchè quindi dovrebbe funzionare? Flags ora non contiene più i valori nè di INIT_VIDEO ne INIT_AUDIO ma un nuovo valore, quindi anche facendo un AND bitwise con il valore di una altra non mi restituisce zero, no? (Se non ho zero l'if viene eseguito comunque, quindi anche un controllo con una altra macro verrebbe superato e verrebbe inizializzato il device anche senza averlo chiesto). Per questo motivo, l'unica soluzione che mi è venuta in mente è proprio quella di controllare il valore del risultato bitwise calcolato in precedenza con la variabile flags (se flags equivale 29 e sò che INIT_VIDEO è 25 e INIT_AUDIO è 20, sò che ho passato questi due interi decimali. Ovviamente nel software potrei confrontare con Codice:
if((SDL_INIT_VIDEO | SDL_INIT_AUDIO) == flags) //.. fai questo Insomma, oltre che trovare il metodo per farlo nel software, mi interessa, se esiste, l'operazione aritmetica per sapere quale valore decimale otterrei, quindi, in parole povere, il semplice SDL_INIT_VIDEO | SDL_INIT_AUDIO quale operazioni aritmetiche compie? Spesso ci sono vari algoritmi per verificare una condizione, ma in questo caso l'unica via mi sembra proprio quella di trasformare il valore in binario e fare i calcoli... Spero di essere stato chiaro. A dir la verità rileggendo il post mi sembra di aver messo altra carne al fuoco... Mi interessa l'implementazione software e se esiste un possibile calcolo aritmetico per calcolare il risultato di una operazione bitwise (una alternativa a questo metodo di risoluzione. [EDIT] Rettifico, ho testato la tua soluzione: Codice:
#include <iostream> #include <cstdlib> using namespace std; #define PRIMO 25 #define SECONDO 20 void test( int bitwise ); int main( ) { test( PRIMO|SECONDO ); getchar(); return( EXIT_SUCCESS ); } void test( int bitwise ) { if( bitwise & PRIMO ) { cout << "hai passato primo" << endl; } if( bitwise & SECONDO ) { cout << "hai passato secondo" << endl; } return; } Mah... non ci ho capito molto allora. Se io passo PRIMO|SECONDO, non ottengo solo il risulato di questa operazione!?! Quindi se poi uso & con questo risultato (PRIMO|SECONDO) e PRIMO, dovrei ottenere un nuovo valore, no? Comunque diverso da zero.... ommamma... mi stà sicuramente sfuggendo qualcosa...
__________________
La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
Isaac Asimov Ultima modifica di Y3PP4 : 11-09-2009 alle 17:18. |
11-09-2009, 17:03 | #5 | |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Quote:
Grazie british!
__________________
La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
Isaac Asimov |
|
11-09-2009, 17:29 | #6 | |||
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Perdonami ma ho davvero difficoltà a comprendere il senso complessivo del tuo quesito, per cui ti rispondo solo a brandelli.
Iniziamo col dire che ciò che ti ha suggerito marco.r è senza dubbio corretto. Quote:
Quote:
Il metodo indicato da marco.r funziona correttamente e senza ambiguità grazie a una premessa da lui fatta: Quote:
ciao! british |
|||
11-09-2009, 18:12 | #7 | ||||||
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Quote:
Quote:
Quote:
Quote:
... speriamo solo non passi di qui PGI-Bis Quote:
Quote:
Perchè in tal caso dovrei trovare il modo di sapere se un tale numero ha un bit asserito corrispondente a quello di un'altro valore delle macro. Comunque per non scomodarvi troppo, mi farò una ripassatina dell'argomento, così da non costringervi a dire cose trite e ritrite, e nel caso non riesca a capire qualcosa, mi prendo la libertà di richiedere a voi Per ora, grazie mille dell'aiuto e dell'attenzione!
__________________
La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
Isaac Asimov |
||||||
11-09-2009, 20:22 | #8 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1816
|
Quote:
Esempio. Andando a guardare l'header di sdl, vedrai che i numeri di cui parli sopra sono definiti come segue: Codice:
#define SDL_INIT_TIMER 0x00000001 #define SDL_INIT_AUDIO 0x00000010 #define SDL_INIT_VIDEO 0x00000020 #define SDL_INIT_CDROM 0x00000100 #define SDL_INIT_JOYSTICK 0x00000200 #define SDL_INIT_NOPARACHUTE 0x00100000 /* Don't catch fatal signals */ #define SDL_INIT_EVENTTHREAD 0x01000000 /* Not supported on all OS's */ #define SDL_INIT_EVERYTHING 0x0000FFFF Codice:
0000000000000000000000001 0000000000000000000010000 0000000000000000000100000 0000000000000000100000000 0000000000000001000000000 0000100000000000000000000 1000000000000000000000000 0000000001111111111111111 Quando tu fai SDL_INIT_TIMER | SDL_INIT_AUDIO ottieni come valore Codice:
0000000000000000000000001 OR 0000000000000000000010000 = ========================= 0000000000000000000010001 Codice:
0000000000000000000010001 AND 0000000000000000000010000 = ========================= 0000000000000000000010000
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
12-09-2009, 09:39 | #9 |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Ah! Ecco allora quale era il mio errore.
Beh non sò proprio come ringraziarti Sei stato gentilissimo, io pensavo sempre al decimale e non più ai binari, per questo non riuscivo a capire Adesso farò qualche test coi vari operatori. Meno male che me lo hai esposto perchè leggendo le varie guide pensavo fossero altre le cose che mi sfuggivano. Grazie ancora e buona giornata! PS. se qualcuno conosce le varie operazioni aritmetiche corrispondente all'utilizzo di un operatore bitwise, è il benvenuto. Per ora grazie a british conosco quella del NOT e quelle due degli shift a destra e a sinistra che conoscevo già...
__________________
La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.
Isaac Asimov |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:36.