Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-10-2009, 16: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, 18: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 13:17.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2009, 15: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 15:26.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 13: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, 13: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 13:40.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 23-10-2009, 13: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, 13: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, 14: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


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Halo Infinite: in arrivo l'ultimo grande...
TV LG OLED 2025: Amazon fa sconti al che...
Forse, finalmente, ci siamo? Alcuni rumo...
Smart home più facile ed economic...
Motorola edge 50 neo in svendita, 202€: ...
Cina e Paesi Bassi verso la distensione ...
'Senza TSMC non ci sarebbe NVIDIA': Jens...
Fumo di sigaretta e sporco per 17 anni: ...
Resi Amazon Natale 2025: cambiano i temp...
L'SSD modulare aggiornabile come un PC: ...
Intel ha denunciato un ex dipendente per...
Blue Origin rinvia il secondo lancio del...
Nasce l'albo degli influencer 'rilevanti...
Il Digital Networks Act è stato r...
ASUS ROG ha lanciato due nuovi monitor d...
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: 09:40.


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