Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico
Motorola propone in fascia media il nuovo Moto G77 5G, uno smartphone che punta sul display AMOLED da 1.5K a 120Hz, e sulla fotocamera da 108 MP con stabilizzazione ottica per affrontare la fascia media. Il tutto insieme a una batteria da 5200mAh in soli 7,3 millimetri di spessore, con una scocca certificata con standard militari
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI ha appena ufficializzato la serie Lito, la sua nuova gamma di droni entry-level destinata a chi si avvicina per la prima volta alla fotografia aerea. Al centro dell'annuncio ci sono due modelli ben distinti per fascia di prezzo e specifiche tecniche: DJI Lito 1 e DJI Lito X1. Entrambi si collocano sotto la soglia regolamentare dei 249 grammi, che permette di volare con requisiti burocratici più semplici rispetto ai droni più pesanti.
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi
Siamo stati a Londra per la premiazione dei Sony World Photography Awards 2026, l'evento a tema fotografia più prestigioso. Fra sorprese e novità, ne approfittiamo per fare il punto sulla fotografia contemporanea, in cui la didascalia è sempre più necessaria a cogliere il senso della quasi totalità degli scatti.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-10-2009, 15:07   #1
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
[Vari/C++/lowlevel] Bitwise Operations e Bitmasks, non ci capisco una ceppa!

Salve,
ho bisogno di creare uno sparo che colpisca tutto tranne i soldati del mio team.
In concreto, uso PhysX e questo si può fare assegnando ad ogni Forma una Mask/Group, e quindi filtrando questi ShapeGroup tramite una bitwise Mask apposita.

La Shape Mask è definita come unsigned short e va da 0 a 31;
la bitwise mask è un unsigned int.

In teoria, ogni team ha una specifica Shape Mask; quindi lancio un Ray che attraversa la scena, configurato per escludere tutte le mask diverse da quelle del mio team.

In pratica essendo completamente a digiuno di operazioni bitwise, non ho idea di come creare un raggio che colpisca tutti i gruppi (0, 30) ma non quello del mio team (31) e viceversa per il nemico (0,31)(30)

Per ora usavo la maschera ottenuta dal codice (trovato in giro):
Codice:
unsigned short teamMask = 0x1f; //31
unsigned int mask = ~(1<< teamMask );
Tuttavia qualsiasi sia teamMask questo mi ritorna 65535... per cui (anche se ignoro il motivo) viene ignorato tutto escluso il gruppo (0).

Mi serve l'aiuto di qualche lowlevel pro
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2009, 17:48   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ciao Tommo,
se la mask di un Ray deve "escludere" tutte le mask diverse dal tuo team, significa che, viceversa, deve "includere" solo la mask del tuo team.

Se il ragionamento è corretto presumo che l'operazione che avviene tra la ray_mask e tutte le group_mask intersecate dal ray sia un semplice & (AND) tra la group_mask da testare e il valore della ray_mask negata (NOT ~).
Se il risultato di questa operazione è diverso da zero (almeno un bit è rimasto a 1) allora la group_mask testata è "esclusa" (cioè colpita dal ray).
Codice:
// per ogni team_mask intersecata dal Ray
result_mask = team_mask & (~ray_mask);
if (result_mask != 0) {
    // colpito-escluso
}
Con questa operazione esiste una sola group_mask che risulterebbe "esclusa" (cioè non colpita): la grop_mask di valore uguale alla ray_mask

Per rendere la cosa un attimo più visiva:
Codice:
myteam_mask = [1][1][1][1][1][1] // vale 31
myray_mask = [1][1][1][1][1][1]

~myray_mask -->[0][0][0][0][0][0]

myteam_mask & (~myray_mask) --> [1][1][1][1][1][1] & [0][0][0][0][0][0] --> 0
Tutti i falg a zero, cioè "non colpito".
Qualsiasi altra mask produrrebbe almeno un flag di vlaore 1, "cioè colpito".
Spero di non aver capito male
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 22-10-2009 alle 12:17.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2009, 14:23   #3
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Allora,
intanto grazie per la risposta

la cosa è molto contorta e le evidenze sperimentali ancora di più
-le mask numero pari non trovano il gruppo 0.
-la maschera che passi dice cosa NON toccare, cioè se mask & shapeMask != 0 allora non viene visto.

Ad esempio assegnando al p1 e al p2 i numeri 1 e 3, si ha che ray( ..., 1 & 3,... ) ignora tutto tranne il suolo.

Siam riusciti ad ottenere quello che serve (cioè che lo sparo colpisce 0 e gruppo_nemico) usando l'arcana formula
~(1<<teamGroup)

Comunque non ne vedo ancora il verso

PS: sapendo questo, come faccio a creare una mask che vede unicamente 0?
Teoricamente sarebbe NOT 0 ma praticamente non va
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 22-10-2009 alle 14:26.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 12:02   #4
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Premessa: quando hai a che fare con bitmask, non pensare tanto ai valori dei numeri quanto ai bit che sono a 1.

Non conosco Physix, ma il fatto che la shape mask abbia valori solo tra 0 e 31 mi fa supporre che funzioni nel modo seguente:

Al numero di shape mask N viene associata la bitmask ( 1 << N ) (ovvero l'N-esimo bit a 1)

Se tu vuoi una mask che non abbia dentro il gruppo 30, devi mettere a uno tutti i bit tranne il 30-esimo, come spiegato nel post precedente.

Poi sei stato un po' avaro di dettagli, ma faro' le seguenti ipotesi:

* Le bitmask di solito di costruiscono con un | non con un &.
* Tipicamente le bitmask indicano quel che si vuole tenere, non togliere
* Devi shiftare tu opportunamente i bit per fare la maschera (ovvero gruppo 0 -> (1<<0) == 1 )

Se non e' cosi' devi adattare la spiegazione che segue.

Se voglio una maschera che tenga i gruppi 1 e 3, allora devo fare ( 1<<1 ) | (1 << 3)
ovvero 0010 | 1000 == 1010

In quest'ottica i tuoi dubbi si spiegano facilmente

Quote:
Originariamente inviato da Tommo Guarda i messaggi
-le mask numero pari non trovano il gruppo 0.
Una mask "numero pari", non e' altro che un maschera con l'ultimo bit a zero, ovvero una che non fara' mai passare il bit piu' basso. Quindi sia che tu usi 0 che (1<<0) il gruppo non passera' mai, perche' in OR con la bitmask dara' sempre zero.

Quote:
-la maschera che passi dice cosa NON toccare, cioè se mask & shapeMask != 0 allora non viene visto.

Ad esempio assegnando al p1 e al p2 i numeri 1 e 3, si ha che ray( ..., 1 & 3,... ) ignora tutto tranne il suolo.
1 & 3 equivale a 0001 & 0011 che da 1. Se tu vuoi che vengano visti i gruppi 1 e 3 devi probabilmente settare gli N-esimi bit a 1, che e' un po' diverso, e farlo con un or, ovvero

0001 | 0100 = 0101

ray( ..., (1<<0) | (1<<2),... )


Quote:
Siam riusciti ad ottenere quello che serve (cioè che lo sparo colpisce 0 e gruppo_nemico) usando l'arcana formula
~(1<<teamGroup)
Niente di arcano. supponendo che teamGroup sia 3, con la formula sopra qui ottieni
~ (1 << 3) == ~(00001000) == (11110111)
Ovvero tutto (anche lo zero, nell'ipotesi che sia 1<<0 ) tranne il tuo team.

Quote:
PS: sapendo questo, come faccio a creare una mask che vede unicamente 0?
Teoricamente sarebbe NOT 0 ma praticamente non va
~0 piglia tutto.
In teoria dovrebbe essere semplicemente 1.
__________________
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 12:38   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ciao marco.r,
scusa ma all'inizio (cioè prima di postare una risp a Tommo) pensavo anch'io esattamente la stessa cosa che hai spiegato.
C'è solo un dettaglio che non mi torna:
Quote:
Originariamente inviato da Tommo
La Shape Mask è definita come unsigned short e va da 0 a 31;
la bitwise mask è un unsigned int.
e, considerato C++ come linguaggio:
Codice:
An unsigned short can hold all the values between 0 and  USHRT_MAX inclusive. USHRT_MAX must be at least 65535.

The short types must contain at least 16 bits to hold the required range of values.
Quindi se la maschera dei gruppi è definita come unsigned short (e il range di valori logici accettati sono compresi inclusivamente tra 0 e 31) vedo un problema nell'avere un 31esimo bit settato nel caso del gruppo 31, dato che quelli garantiti come minimo sono 16... forse non mi è chiaro qualcosa?


Quote:
Originariamente inviato da marco.r
Poi sei stato un po' avaro di dettagli, ma faro' le seguenti ipotesi:
Sì, è un maledetto
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 23-10-2009 alle 12:40.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 12:54   #6
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Quindi se la maschera dei gruppi è definita come unsigned short (e il range di valori logici accettati sono compresi inclusivamente tra 0 e 31) vedo un problema nell'avere un 31esimo bit settato nel caso del gruppo 31, dato che quelli garantiti come minimo sono 16... forse non mi è chiaro qualcosa?
Non ha detto se e' definito come un unsigned int in generale o sulla sua piattaforma. Nel secondo caso tornerebbe tutto, anche perche' su piattaforme 32/64 bit gli interi sono a 32 bit, cosi' come, se non ricordo male, in CUDA.
__________________
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 12:57   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Non ha detto se e' definito come un unsigned int in generale o sulla sua piattaforma.
Non ci avevo pensato ma avevo immaginato che fosse il tipo documentato come input dalla libreria.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 13:10   #8
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Ha completamente ragione marco.r

Cmq siamo riusciti a risolvere portando finalmente tutto terra terra
E' vero, la bitmask indica quello che si vuole tenere, ed ad esempio

ray( 1<<gruppo ) vede solo quel gruppo.
1<<0 vede solo il terreno, 1<<1 solo il player 1 etc... combinandoli ed invertendoli vien fuori tutto quello che serve

lo sparo è quindi risolto come ray( ~(1<<myTeam ) ).

Grazie dell'aiuto

PS: la bitmask era NxU32, cioè unsigned int 32 su tutte le piattaforme... scusate se era ambiguo!
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico Recensione Moto G77: display AMOLED e buona auto...
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla DJI Lito 1 e Lito X1 recensione: i nuovi droni p...
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi Sony World Photography Awards 2026: i premiati, ...
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince Una settimana con Hyundai Ioniq 5 N-Line: divert...
Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo Recensione OPPO Find X9 Ultra: è lui il c...
Addio app? OpenAI prepara lo smartphone ...
MacBook Air 13" con chip M5 in offerta s...
Un round pre seed da 500mila euro per Va...
Non si butta via niente: Intel fa soldi ...
Cos'è Windows K2: il piano segreto di Mi...
L'attentatore di Trump sviluppava videog...
Le nuove icone delle app Google sono qui...
GIGABYTE GAMING 1000GM PG5, efficienza G...
Il Maine non fermerà i data cente...
Mille satelliti per alimentare l'AI: il ...
Energia infinita dagli oceani? Questo na...
Hacker fingono di essere il supporto IT ...
Samsung abbatte il muro dei 10 nanometri...
70mai A410 a 79,99€: la dashcam doppia a...
La US Navy ha testato il laser anti-dron...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:27.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v