2010-07-22 72 views
36

tengo esta declaración en Java:barra vertical (|) en Java operador

System.out.println(3|4); 

¿Por qué es la salida 7?

+1

¿Qué esperabas? ¿Y por qué? – EJP

+0

@EJP: El propósito de la notación del operador en los lenguajes de programación es hacer posible usar la misma notación en nuestros programas que usamos en el resto de nuestras vidas. La barra vertical normalmente significa * es divisible por *, así que aunque no puedo hablar por el OP, yo mismo esperaría que el resultado de '3 | 4' fuera' falso' y no '7' y sospecho que eso todos los que tomaron matemáticas en la escuela secundaria esperarían lo mismo. –

+2

Aquí en EE. UU., Donde se especificó Java, una barra vertical no tiene nada que ver con la división. Utilizamos barras horizontales (a veces con puntos arriba y abajo) y en ocasiones más raras una barra inclinada. Nunca una línea vertical. –

Respuesta

75

Es una operación OR bit a bit. Está modificando las cosas a nivel binario.

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

Abra Windows calc utilizando el modo científico. Puede cambiar entre decimal y binario (y hexadecimal) y realizar operaciones bit a bit incluyendo o, y, xor, etc.

Para hacer un bitwise o en su cabeza o en papel, compare cada dígito del mismo ordinal. Si cualquiera de los números es un 1, el resultado en ese ordinal será 1.

10

Está haciendo una operación de bitwise OR, y 3 OR 4 es 7.

Ver aquí: http://en.wikipedia.org/wiki/Bitwise_OR#OR

+3

De hecho. Para expandir ligeramente la explicación de dcp, en Java una sola tubería, '|', es lo que se llama 'OR de Bitwise'. Eso significa que realiza un nivel bajo O en los bits reales que componen los argumentos. En este caso, 3 es '0011' y 4 es' 0100' (se muestran al menos 4 bits significativos). Un OR Bitwise recorre cada bit y lo establece en un 1 si * cualquiera * de los bits son 1, por lo que en este caso obtienes '0111', o 7. ¿Qué intentabas imprimir en realidad, o era este un ejemplo? de un libro/tutorial? – Stephen

+0

-1: El propósito de SO es crear la respuesta definitiva. Esto no explica por qué '3 | 4 == 7' –

+0

gracias por contestar – bentham

39

El operador | hace un "O bit a bit". La salida de O a nivel de bit en dos bits es 1 si cualquiera de los bits es 1 o 0 si ambos bits son 0. El bit OR en dos números solo hace un OR a nivel de bit en cada bit individualmente.

He aquí cómo funciona: 3|4

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

+1: la demostración de '12 | 10' podría ser un ejemplo más completo del operador bit a bit u. Aunque el OP aquí pregunta específicamente sobre '3 | 4' –

4

| es el operador "bitwise". en a | b, si el n-ésimo bit de a y/o b es 1, el enésimo bit del resultado será 1. 3 es 11 en binario. 4 es 100 en binario.

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

Y 111 resulta ser la representación binaria de 7.

8

representación binaria:

3 = 00000011 
4 = 00000100 

| is bitwise OR operator 

cuando usted o dos números, se toma la representación binaria y la O resultado es 1 IFF para esa columna al menos una columna se establece verdadero (1)

Así

00000011 
00000100 
-------- 
00000111 

continuación, columnas te dice el valor en esa posición:

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

por lo

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

cualquier columna con un 1 significa que se agrega el valor de esa columna:

4 + 2 + 1 = 7 
2

operadores Como bit a bit puede ser un poco confuso sin algo que se correlaciona a la manera en que yo' he explicado su función a los no programadores, incluso si usted simplemente sustituye 1 por verdadero y 0 por falso, y luego se comportan de manera idéntica a los operadores en el idioma inglés:

la luna es azul y el cielo es azul, es falsa

0 y 1 es 0

la luna es azul O el cielo es azul, es cierto

0 o 1 es 1

pero la analogía se rompe cuando llegue a:

el océano es azul XOR los árboles son de color verde, es falso

+0

Para explicar XOR, algo así como "¿Quieres helado de torta XOR para el postre?" podría ser ilustrativo. :) Caso típico donde el lenguaje natural "o" en realidad significa "cualquiera pero no ambos". – Jonik

4

es útil para darse cuenta de que hay un sistema generalizado para el conteo subyacente a esto Binario es base-2. Decimal familiar es base-10. El permiso de Linux octal es base 8.

El valor de un número se obtiene sumando los valores individuales de cada uno de sus dígitos. Para cualquier dígito, el valor se deriva de una fórmula simple.

(dígitos) * (base)^(número de lugares a la izquierda del punto decimal)

123 = un centenar de y veinte tres = (1 * 10^2) + (2 * 10^1) + (3 * 10^0) = 100 + 20 + 3

supe que en CS211 (no jactancia, sólo recordar)

Cuestiones relacionadas