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
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");
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");
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");
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
++
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:
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
++
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
"Jean-Pierre B." <jpbordi@yahoo.fr> 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.
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
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
"Jean-Pierre B." <jpbordi@yahoo.fr> 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
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
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.
@++
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.
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.
@++
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
"Jean-Pierre B." <jpbordi@yahoo.fr> 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.
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
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
Eric Jacoboni <jaco@neottia.net> typa:
"Jean-Pierre B." <jpbordi@yahoo.fr> 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
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
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
"Jean-Pierre B." <jpbordi@yahoo.fr> 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
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
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
Pierre Maurette <maurette.pierre@free.fr> 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