forcer le type d'un nombre 1 << n

Bonjour,
quand je fais cette opération, il me semble que ça marche maux quand n > 15
or mon besoin c'est pour des nombres uint64_t, donc n peut prendre des valeurs de 0 à 63 (c'est pour faire des masques)
je me souviens qu'il y a un moyen pour forcer le type, mais c'est tout ... l'âge ... : un jeune d'esprit peut-il me rafraîchir la mémoire ?

Bonjour,

Je pense qu'il faut forcer un unsigned long

1UL<<n

merci Kamil,
c'était bien ça dont je me souvenais plus
mais c'est du 64 bits, j'ai essayé 1uint64_t, mais il n'en veut pas ...
je m'en suis sorti autrement, en décalant le nombre à masquer et en laissant le masque à 1 ; ce qui est sans doute fastoche pour l'esp32

Pour 64 bits c'est 1ULL<n

sinon stockez 1 dans un uint64_t et ensuite décalez

uint64_t masque = 1;
masque <<= 23; // décalage à gauche de 23 positions

ou autre façon de faire c'est de typer le 1 par un 'cast' (si on a oublié ULL) avant de décaler uint64_t masque = ((uint64_t) 1) << 23;

merci, ça marche
j'ai retenu 1ULL
j'avais manqué de jugeotte vis à vis des 2 autres méthodes

extrait :
dp_bitn--; //
if (dp_u64[paket_to_send] & (1ULL << dp_bitn)) { // ULL force le 1 à 64 bits

c'est pour transmettre bit par bit et msb 1st le mot de 64 bits nommé dp_u64[paket_to_send]

OK - une autre façon de faire pour ce genre de test c'est de faire le contraire:  if ((dp_u64[paket_to_send] >> dp_bitn) & 0x1) {...

oui, c'est ce que j'avais fait, mais j'ai pensé que ripper le 1 est + intuitif, voire + élégant, voire + écologique :slight_smile:

Si vous êtes sur un processeur 8 bits, ça l'oblige à faire un masque sur 64 bits et bcp de maths pour voir si le résultat est non nul (il doit regarder les 8 octets) - dans le second cas le compilo ne le fait sans doute que sur 16 bits voir peut-être 8 bits seulement donc c'est cette version qui est la plus écologique :slight_smile:

d'ailleurs si vous regardez le code source de bitRead() vous verrez que c'est codé comme cela#define bitRead(value, bit) (((value) >> (bit)) & 0x01)(vous verrez aussi au passage que les autres fonctions utilisent un UL et pas un UUL donc ne correspondraient pas à vos besoins)

une telle opération peut se faire facilement avec un avr, mais sans vouloir sottement tout shifter, alors en allant tout simplement lire directement le bit qu'on cherche dans l'octet qu'il faut ... on ne fait au final que d'écrire la chose de la manière qui nous convient, charge au compilateur d'en faire quelque d'intelligent
j'utilise un esp32 ; je ne sais pas comment c'est fait à l'intérieur, mais si on se risque à une analogie avec l'arm, il pourrait faire des shifts de 31 bits sur des registres de 32 bit, ou bien, en 2 cycles, des shifts de 63 bits sur 2 registres contigus de 32 bits : dans ces conditions, il n'y a plus rien à optimiser

Oui le compilateur sait être smart si la valeur est fixe le 0x01 aide à cela.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.