Notation en java

Bon je voulais mettre ça dans la shoutbox car ça vaut pas vraiment un thread, mais elle a l’air de pas apprécier mon message, donc je demande ici.
que veut dire “1 << 9” dans

J’ai vu ça dans la classe SWT, et j’avoue que ça m’intrigue. les “<<” n’étant pas très appréciés des outils de recherche, autant demander à des humains :).

Merci !

Si c’est comme en C++ c’est un bitshift, donc 1 shift à gauche de 9, ce qui signifie en langage courant : 2 exposant 9, soit 512.

Ok merci. Tant qu’on y est : est-ce qu’il y a un avantage à adopter cette notation ?

oh oui, dans la programmation systeme.
tu prends un registre d’un composant et tu veux mettre le bit 9 a 1 : tu fous (1 << 9) dans le registre avec un OR logique.

ex:

registre = registre | (1 << 9).

Ca touche pas aux autres bits, et ca mets le 9e bit a 1.

Par contre, je crois qu’il faut faire gaffe par contre aux systemes little endian / big endian (si je me trompe pas, le décalage se fait a droite ou a gauche selon si c’est l’un ou l’autre.)

Non, c’est juste une question de lisibilité. Surtout quand on fait des masques, genre je veux le bit 4 et le bit 8 à 1 et les autres à 0, je peux écrire ça de deux façons différentes:

int mask = (1 << 4) + (1 << 8); int mask = 272;
La première ligne permet de clairement voir de quels bits on parle.

A part obscurcir ton code, je ne vois pas. :slight_smile:

Sinon, SWT est une bibliothèque bas niveau avec pas mal de code en natif, il peux donc y avoir des intérêts vu que ce type de notation est beaucoup plus utilisés en C/C++.

Ca coute aussi beaucoup moins cher en temps machine, pour faire une puissance de 2, de faire un shift que d’appeler la fonction de maths correspondante (Math.pow, pow…)

Oui, autant en C/C++ ça me surprend pas de toucher aux bits, autant en java ça me parait plus inhabituel (enfin pour moi).

Y a pas de raison de pas utiliser des flags et tout en java ou en C# ou autre :).

C’est sur.
Merci beaucoup pour vos réponses :).

http://java.sun.com/docs/books/tutorial/ja…dbolts/op3.html

sinon, je suis pas fan de ce genre d’écritures. Y compris en C++. Ca me parait plus clair d’écrire ça en binaire ou en hexa…

Ha bin ouais, a la declaration d’une constante, c’est sur que ca coute moins cher en temps machine d’ecrire 1 << 9 plutot que 512 …

Honnetement, a par rendre ton code illisible, je vois aucun interet ici. Aucun quand on fait de la manipulation de bit, comme dans le decodage de trame par exemple, la notation x<<y est tres appreciable, autant la …

[quote=« cben76, post:12, topic: 37857 »]Ha bin ouais, a la declaration d’une constante, c’est sur que ca coute moins cher en temps machine d’ecrire 1 << 9 plutot que 512 …

Honnetement, a par rendre ton code illisible, je vois aucun interet ici. Aucun quand on fait de la manipulation de bit, comme dans le decodage de trame par exemple, la notation x<<y est tres appreciable, autant la …[/quote]

Selon moi, ça sert juste à insister sur le fait que ce soit une puissance de 2.

Alors faut mettre un commentaire :slight_smile:

int x = 512   // 2^9

Non, mais dans l’absolu… :slight_smile:
En l’occurence, ca m’est arrivé pour des declarations de constantes avec des shift pour faire des bitmask.

const KeyModifier ControlKey = 1 << 0; const KeyModifier AltKey = 1 << 1; const KeyModifier ShiftKey = 1 << 2; const KeyModifier MetaKey = 1 << 3; // better known as the "WIN" key on WIN32, and "COMMAND" key on OSX, see below const KeyModifier MenuKey = 1 << 4;

C’est plus lisible que 1, 2, 4, 8, 16 ou meme que 0x01, 0x02, 0x04, 0x08, 0x10.

Il est aussi possible que le codeur sorte d’une formation sur le bitshift (ou pire soit un ancien codeur C :slight_smile: )

[quote=« LodeRunner, post:15, topic: 37857 »]Non, mais dans l’absolu… :slight_smile:
En l’occurence, ca m’est arrivé pour des declarations de constantes avec des shift pour faire des bitmask.

const KeyModifier ControlKey = 1 << 0; const KeyModifier AltKey = 1 << 1; const KeyModifier ShiftKey = 1 << 2; const KeyModifier MetaKey = 1 << 3; // better known as the "WIN" key on WIN32, and "COMMAND" key on OSX, see below const KeyModifier MenuKey = 1 << 4;

C’est plus lisible que 1, 2, 4, 8, 16 ou meme que 0x01, 0x02, 0x04, 0x08, 0x10.[/quote]

Bin c’est ce qu’on dit depuis le depart : dans le cas ici present, ca sert a rien, a part a rendre le code plus obscure (ou insister sur le fait que c’est une puissance de 2 mais bon).
Ca veut pas dire qu’il faut jamais l’utiliser ou que c’est toujours moins clair. Ton exemple le montre, ou quand on a besoin de traitrer des flux.
Mais ici, je vois pas.

[quote=« cben76, post:14, topic: 37857 »]Alors faut mettre un commentaire :slight_smile:

int x = 512   // 2^9

Ouais, pourquoi faire simple quand on peut faire compliqué, c’est vrai…

Je vois pas pourquoi vous vous battez la :slight_smile:
Un bon vieux 1<<9 des familles est plus rapide a taper et plus facile a lire qu’un assignement avec commentaire, de plus, quand vous en avez des pages et des pages, et que vous faite du bit shift dans des registres obscures de GPUs, je suis sur qu’il y a des trucs beaucoup plus interessant a mettre dans le commentaire que le fait que « oui, 512 == 2^9 == 1 << 9 » :crying:

Vous savez ce qu’ils vous disent, les anciens codeur C?
Sarieux, ils respectent plus rien, ces jeunes cons :cry:

[quote=« c0unt0, post:19, topic: 37857 »]Je vois pas pourquoi vous vous battez la :slight_smile:
Un bon vieux 1<<9 des familles est plus rapide a taper et plus facile a lire qu’un assignement avec commentaire, de plus, quand vous en avez des pages et des pages, et que vous faite du bit shift dans des registres obscures de GPUs, je suis sur qu’il y a des trucs beaucoup plus interessant a mettre dans le commentaire que le fait que « oui, 512 == 2^9 == 1 << 9 » :crying:

Vous savez ce qu’ils vous disent, les anciens codeur C?
Sarieux, ils respectent plus rien, ces jeunes cons :cry:[/quote]

Un bon développeur, est toujours un peu faignant (dans le sens qu’il va se casser le cul pour factoriser un maximum de trucs, et écrire le moins possible, et aussi avoir le temps de prendre 5 poses café dans l’après-midi), donc un bon développeur ne connait pas ses tables de puissances de 2, donc un bon développeur utilise le bit shift :

  • Hey Duchmol, ca fait combien 2 ^ 12 + 2 ^3?
  • (1<<12)+(1<<3) :stuck_out_tongue: