OVH Cloud OVH Cloud

Operateur bit a bit en java

12 réponses
Avatar
Jean-Pierre B.
bonjour,

je débute en java et je cherche un exemple pour tester les bit a 1 ou 0 d'un
ocect en java, en c j'ai pas de probleme, maisj'ai pas le
meme comportement en java.


genre
char ch=0xa7; // 1010 0111

afficher via une boucle en fonction de l'indice bit a 1
ou bit a 0

J'ai fait des recherches avec google, mais j'ai rien trouver de concluant,
je lance un appel a pro du langage

Merci pour vos réponses

Cordialement

2 réponses

1 2
Avatar
Eric Jacoboni
Pierre Maurette writes:

Remarquez, l'exemple de ma doc (PDF Borland JBuilder) ne compile pas !

short i = 13; //i a la valeur 0000000000001101
i = i << 2; //i a la valeur 0000000000110100


Normalement, << renvoie un int, sauf si l'une des opérandes est un
long.

On pourrait donc se dire qu'il s'agit d'un pb de conversion implicite
de int en short (qui n'est pas autorisée, évidemment).

En faisant i = (short)(i << 2); ça passe.

i <<= 2; passe aussi, d'ailleurs, ce qui fait que ce n'est donc pas
exactement équivalent à i = i << 2; contrairement à ce que prétendent
les docs.
--
Éric Jacoboni, né il y a 1390128264 secondes

Avatar
Pierre Maurette
Eric Jacoboni typa:

Pierre Maurette writes:

Remarquez, l'exemple de ma doc (PDF Borland JBuilder) ne compile pas !

short i = 13; //i a la valeur 0000000000001101
i = i << 2; //i a la valeur 0000000000110100


Normalement, << renvoie un int, sauf si l'une des opérandes est un
long.
Oui. La spécification du langage est claire ($15.19, puis $5.6.1) même

si un peu touffue. Tout est précisé, y compris bien sûr le
comportement par rapport au signe. Il est normal que ça compile avec
int et long, et que ce soit refusé avec byte, short, et char.

<cit Doc Borland>
Il y a deux types d’opérateurs au niveau bits : opérateurs de décalage
et opérateurs booléens. Les opérateurs de décalage permettent de
décaler les chiffres binaires d’un entier vers la droite ou vers la
gauche. Etudiez l’exemple suivant (le type entier short est utilisé à
la place du type int pour plus de concision) :
short i = 13; //i a la valeur 0000000000001101
i = i << 2; //i a la valeur 0000000000110100
Dans la deuxième ligne, l’opérateur de décalage des bits décale tous
les bits de i de deux positions vers la gauche.
</cit>
En fait, le gars, il a eu la flemme de se taper les 32 bits, il est
passé en short sans faire tourner le code. Me rappelle quelqu'un, ce
gars-là ...


On pourrait donc se dire qu'il s'agit d'un pb de conversion implicite
de int en short (qui n'est pas autorisée, évidemment).

En faisant i = (short)(i << 2); ça passe.

i <<= 2; passe aussi, d'ailleurs, ce qui fait que ce n'est donc pas
exactement équivalent à i = i << 2; contrairement à ce que prétendent
les docs.
<cit $15.26.2>

A compound assignment expression of the form E1 op= E2 is equivalent
to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1
is evaluated only once.
</cit>
Heureusement, sinon il serait difficile d'utiliser short <<= value;
Ou mettre le cast? ;-)

J'ajoute que tout ça est satisfaisant,ça permet de faire par exemple
sans ambiguïté des trucs comme :
short s;
int i = s << 8;
--
Pierre


1 2