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

10 réponses

1 2
Avatar
Unknown
Le Sun, 06 Jun 2004 13:51:27 +0200, Jean-Pierre B. a écrit :


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.


en plus de tout ce qu'on a déjà dit tu peux aussi, comme en c faire :
if ( c >> i % 2 == 0 )
System.err.println(i+"ième bit à 0");

Avatar
gregg
Jean-Pierre B. wrote:
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.


c'est pareil qu'en C, sur le principe, seule la forme diffère:

char ch = 0xa7;

//test du 3 bit depuis le LSB:

if ( (ch & 4) == 4 )
// bit à 1
else
// bit à 0


++

Avatar
Eric Jacoboni
"Jean-Pierre B." writes:


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.


Pourtant, ça marche pareil (sauf qu'en Java le typage est plus strict,
évidemment).

Un truc rapide, du genre :

public class Shift {
public static void main(String[] args) {
byte ch = (byte)0xa7;

for (int i = 1; i <= 8; i++) {
if (ch <= 0)
System.out.print('1'); // ou tout autre traitement
else
System.out.print('0'); // ou tout autre traitement
ch <<= 1;
}
System.out.print("n");
}
}

Ou alors, utiliser la classe BitSet, qui permet de manipuler
simplement des tableaux de bits et qui dispose des méthodes idoines.

--
Éric Jacoboni, né il y a 1389968628 secondes

Avatar
Pierre Maurette
"Jean-Pierre B." typa:


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
Ben non, newby tot en Java.

[sources Java Language Specification Second Edition, de Sun, dans le
fichier langspec.jar de mon JBuilder9]

Les opérateurs bitwise sont les mêmes qu'en C :
& | ^ ~ << >> >>>
De plus, à l'inverse du C, le comportement est prévisible. Les types
sont bien définis, tous les types entiers sont sur un nombre précis de
bits, signés en complément à 2. D'où les >> (signed right shift) >>>
(unsigned right shift).
Je me demande ce qui se passe sur une plateforme sur laquelle le
codage naturel des entiers serait radicalement différent de Java.

Attention, char est un type caractère Unicode sur 16 bits non signé
(au vu de votre code, on peut se damander si vous ne le considérez par
comme sur 8 bits). Il est certainement préférable d'utiliser de vrais
types entiers pour mener des calculs (byte sur 8 bits signé, short sur
16 bits signé). De même, il existe un vrai type boolean. Nous ne
sommes plus en C, profitons-en.

<code>
//char ch = 0x00a7; // 0000 0000 1010 0111
//byte ch = 0xa7; // 1010 0111
char ch = 'u00a7'; // 0000 0000 1010 0111
System.out.println(Integer.toString(ch)); //167
char c = 1;
int i = 0;
do {
if((c & ch) != 0)
System.out.println("Bit n°" + Integer.toString(i++) + " à 1");
else
System.out.println("Bit n°" + Integer.toString(i++) + " à 0");
c *= 2;
}while(i < 16);
</code>
--
Pierre

Avatar
Jean-Pierre B.
for (int i = 1; i <= 8; i++) {
if (ch <= 0)
System.out.print('1'); // ou tout autre traitement
else
System.out.print('0'); // ou tout autre traitement
ch <<= 1;


Merci pours vos réponses.

j'ai pu ecrire mon petit prog, mais j'ai une question qui me trotine dans la
tete.

le ch <<=1 marche très bien, mais curieusement si on ecrit ch=ch<<1; ce qui
revient a la meme chose, en C pas de problème

Mais lors de la compilation avec javac j'obtiens une erreur m'informant d un
risque de perdition de bit vis a vis d'un (int), meme si je cast partout
avec un (byte).

c est très curieux, ch<<=1; revient etre le raccourci de la ligne ch=ch<<1;
mais l'interpretation des operateurs par le
compilo de java semble different.. bizarre bizarre.

@++

Avatar
Eric Jacoboni
"Jean-Pierre B." writes:


Mais lors de la compilation avec javac j'obtiens une erreur m'informant d un
risque de perdition de bit vis a vis d'un (int), meme si je cast partout
avec un (byte).


Euh, chez moi, le programme que j'ai donné se compile sans erreur...

c est très curieux, ch<<=1; revient etre le raccourci de la ligne ch=ch<<1;
mais l'interpretation des operateurs par le
compilo de java semble different.. bizarre bizarre.


Une différence importante entre C et Java est qu'en Java, les types
ont une taille connue. Notamment, un char fait 16 bits, un byte 8 bits
et un int 16 bits.


--
Éric Jacoboni, né il y a 1390089910 secondes

Avatar
Pierre Maurette
Eric Jacoboni typa:

"Jean-Pierre B." writes:


Mais lors de la compilation avec javac j'obtiens une erreur m'informant d un
risque de perdition de bit vis a vis d'un (int), meme si je cast partout
avec un (byte).


Euh, chez moi, le programme que j'ai donné se compile sans erreur...

c est très curieux, ch<<=1; revient etre le raccourci de la ligne ch=ch<<1;
mais l'interpretation des operateurs par le
compilo de java semble different.. bizarre bizarre.


Une différence importante entre C et Java est qu'en Java, les types
ont une taille connue. Notamment, un char fait 16 bits, un byte 8 bits
et un int 16 bits.
Pas tout à fait selon ma documentation. Un short fait 16 bits, un int

32 et un long 64. Tous signed, sauf le char.
Remarque: est-il utile de vouloir considérer le char comme un type
numérique et ainsi de retomber dans un des travers du C ?
--
Pierre


Avatar
Pierre Maurette
"Jean-Pierre B." typa:

for (int i = 1; i <= 8; i++) {
if (ch <= 0)
System.out.print('1'); // ou tout autre traitement
else
System.out.print('0'); // ou tout autre traitement
ch <<= 1;


Merci pours vos réponses.

j'ai pu ecrire mon petit prog, mais j'ai une question qui me trotine dans la
tete.

le ch <<=1 marche très bien, mais curieusement si on ecrit ch=ch<<1; ce qui
revient a la meme chose, en C pas de problème

Mais lors de la compilation avec javac j'obtiens une erreur m'informant d un
risque de perdition de bit vis a vis d'un (int), meme si je cast partout
avec un (byte).

c est très curieux, ch<<=1; revient etre le raccourci de la ligne ch=ch<<1;
mais l'interpretation des operateurs par le
compilo de java semble different.. bizarre bizarre.


Logiquement, Java fait une promotion de type sur un décalage à gauche,
décalage signé, et demande un cast explicite:

byte by = -32; // 1110 0000
int i = by << 1;
System.out.println(Integer.toString(i));//-64
by = (byte)(by << 1);
System.out.println(Integer.toString(by));//-64

Mais;

byte by = -120; // 1000 1000
int i = by << 1;
System.out.println(Integer.toString(i));//-240
by = (byte)(by << 1);
System.out.println(Integer.toString(by));// 16

by<<=1;
est le raccourci de by = (byte)(by << 1);
c'est à dire à by = (byte)((int)by << 1); (je ne suis pas certain pour
le int, c'est peut-être short).

Attention:
by = (byte)by << 1;
caste by de ... byte en byte. C'est bien le résultat et non l'opérande
qu'il faut caster, à l'aide de parenthèses.

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

Il y a peut-être quelque chose qui m'échappe.

--
Pierre


Avatar
Eric Jacoboni
Pierre Maurette writes:


Pas tout à fait selon ma documentation. Un short fait 16 bits, un int
32 et un long 64.


Eu oui, un int fait 32 bits.

Remarque: est-il utile de vouloir considérer le char comme un type
numérique et ainsi de retomber dans un des travers du C ?


Non, vu qu'il y a byte pour ça.
--
Éric Jacoboni, né il y a 1390127601 secondes

Avatar
Eric Jacoboni
Pierre Maurette writes:


Pas tout à fait selon ma documentation. Un short fait 16 bits, un int
32 et un long 64.


Euh oui, un int fait 32 bits, pardon.

Remarque: est-il utile de vouloir considérer le char comme un type
numérique et ainsi de retomber dans un des travers du C ?


Non, je ne le pense pas.
--
Éric Jacoboni, né il y a 1390127601 secondes

1 2