2010-07-22 5 views
36

J'ai cette déclaration en Java:pipe (|) opérateur en Java

System.out.println(3|4); 

Pourquoi la sortie 7?

+1

Qu'est-ce que vous attendez? Et pourquoi? – EJP

+0

@EJP: Le but de la notation opérateur dans les langages de programmation est de permettre d'utiliser la même notation dans nos programmes que nous utilisons dans le reste de nos vies. La barre verticale signifie généralement que * est divisible par *, donc bien que je ne puisse pas parler pour l'OP, je m'attendrais moi-même à ce que le résultat de '3 | 4' soit 'faux' et non '7' et je suspecte que Tous ceux qui ont suivi des cours de mathématiques au secondaire s'attendraient à la même chose. –

+2

Ici, aux Etats-Unis, où Java était spécifié, une barre verticale n'a rien à voir avec la division. Nous utilisons des barres horizontales (parfois avec des points au-dessus et en dessous) et à des occasions plus rares une barre oblique. Jamais une ligne verticale. –

Répondre

75

C'est une opération OU. C'est en train de modifier les choses au niveau binaire.

   011      3 
in binary: | 100  in decimal: | 4 
      ___     ___ 
      111      7 

Ouvrir le calcul Windows en mode scientifique. Vous pouvez basculer entre décimal et binaire (et hex) et effectuer des opérations au niveau du bit, y compris,,, xor, etc.

Pour faire un bit ou dans votre tête ou sur papier, comparez chaque chiffre du même ordinal. Si l'un des nombres est un 1, le résultat à cet ordinal sera 1.

10

Cela fait une opération bitwise OR et 3 OR 4 est 7.

Voir ici: http://en.wikipedia.org/wiki/Bitwise_OR#OR

+3

En effet. Pour développer légèrement l'explication de dcp, en Java un seul tuyau, '|', est ce qu'on appelle un 'OU bit à bit'. Cela signifie qu'il effectue un niveau bas OU sur les bits réels qui composent les arguments. Dans ce cas, 3 est '0011' et 4 est' 0100' (au moins 4 bits significatifs sont montrés). Un OU binaire traverse chaque bit et le met à 1 si * l'un des * bits est 1, donc dans ce cas, vous obtenez '0111', ou 7. Qu'est-ce que vous essayiez réellement d'imprimer, ou était-ce un exemple d'un livre/tutoriel? – Stephen

+0

-1: Le but de SO est de créer la réponse définitive. Ceci n'explique pas pourquoi '3 | 4 == 7' –

+0

merci d'avoir répondu – bentham

39

L'opérateur | exécute un "OR bit à bit". La sortie de OU binaire sur deux bits est 1 si l'un des deux bits est 1 ou 0 si les deux bits sont 0. Bit à OU sur deux nombres fait un OU bit à bit sur chaque bit individuellement.

Voici comment 3|4 œuvres:

3: 00000011 
    4: 00000100 
-------------- 
3|4: 00000111 = 7 
+1

+1: la démonstration de '12 | 10' pourrait être un exemple plus complet de l'opérateur bitwise-or. Bien que l'OP ici demande spécifiquement sur '3 | 4' –

4

| est l'opérateur "bitwise ou". dans a | b, si nième bit de a et/ou b est 1, le nième bit du résultat sera 1. 3 est 11 en binaire. 4 est 100 en binaire.

0 1 1 
or or or 
1 0 0 
= = = 
1 1 1 

Et 111 se trouve être la représentation binaire de 7.

8

Représentation binaire:

3 = 00000011 
4 = 00000100 

| is bitwise OR operator 

lorsque vous ou deux numéros, vous prenez la représentation binaire et le ou le résultat est 1 IFF pour cette colonne au moins une colonne est vrai (1)

donc

00000011 
00000100 
-------- 
00000111 

puis, colonnes vous dire la valeur à cette position:

128, 64, 32, 16, 8, 4, 2, 1 

si

128, 64, 32, 16, 8, 4, 2, 1 
0 , 0, 0, 0, 0, 1, 1, 1 

une colonne avec un 1 signifie que vous ajoutez la valeur de cette colonne:

4 + 2 + 1 = 7 
2

Comme les opérateurs de bits peuvent être un peu déroutant, sans quoi les corrèle à, la façon dont je Nous avons expliqué leur fonction aux non-programmeurs, même si vous substituez simplement 1 pour vrai et 0 pour faux, et ensuite ils se comportent de manière identique aux opérateurs dans la langue anglaise:

la lune est bleu et le ciel est bleu, est faux

0 et 1 0

la lune est le bleu ou le ciel est bleu, est vrai

0 ou 1 est 1

mais l'analogie tombe en panne quand j'arrive à:

l'océan est bleu XOR les arbres sont verts, est faux

+0

Pour expliquer XOR, quelque chose comme" Voulez-vous le gâteau XOR de crème glacée pour le dessert? " pourrait être illustratif. :) Cas typique où le langage naturel "ou" signifie en réalité "mais pas les deux". – Jonik

4

Il est utile de réaliser qu'il ya un système généralisé pour le comptage sous-jacente. Le binaire est base-2. La décimale familière est base-10. L'autorisation octale Linux est la base 8.

La valeur d'un nombre est obtenue en additionnant les valeurs individuelles de chacun de ses chiffres. Pour tout chiffre, la valeur est dérivée d'une formule simple.

(chiffres) * (base)^(nombre de places à gauche de la virgule décimale)

123 = 123 = (1 * 10^2) + (2 * 10^1) + (3 * 10^0) = 100 + 20 + 3

J'ai appris que dans CS211 (pas de la vantardise, juste se souvenir)