entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Tipos de datos en Java

Estoy estudiando los operadores bit a bit (bitwise) y para comprenderlo mejor hice un pequeño programa:

class Shift {
    public static void main (String args[]) {
        short b = 16384;

        for (int t = 32768; t > 0; t = t/2) {
            if ((b&t) !=0) System.out.print("1 ");
            else System.out.print ("0 ");
        }
        System.out.println();
        b = (short)(b+2);
        for (long t = 2147483648L; t > 0; t = t/2) {
            if ((b&t) != 0) System.out.print ("1 ");
            else System.out.print ("0 ");
        }
        System.out.println();
    }
}

La salida de este código me da:

C:\>java Shift
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0

¿Por qué el segundo for me devuelve un int?
Gracias.

2 Respuestas

1voto

Leonardo-Tadei Puntos227320

Hola @euriloco,

ambas salidas muestran la representación interna de un entero en "little indian", en el primer caso de 16 bits (int) y en segundo caso de 32 bits (long) ya que en Java el "long" es un "entero largo".

Para hacer la prueba más interesante, compará estas salidas con las que da definir un int y un long "unsigned".

Respecto de la variable de control de los bucles, conociendo la longitud interna de cada tipo de dato, podrías hacer sencillamente un bucle hasta 16 o hasta 32 y estar seguro de la cantidad de iteraciones... luego con el operador de bitwise ir extrayendo bit a bit cada parte del entero.

Saludos!

0voto

euriloco comentado

Gracias.
Mi duda es con respecto al segundo for, estoy haciendo un AND de un short y un long. No entiendo por qué la salida es un int.

0voto

Leonardo-Tadei comentado

Un int y un long son distintos tipos de enteros, solo tienen diferente longitud en bytes...

1voto

bl4z3r Puntos16850

Dentro del segundo bucle for, inicializas a t como un Integer.MAX_VALUE + 1, por ende, lo convierte a long y recorre los bits faltantes. El tema es que recorre solamente 16 bits por que, en el la siguiente operación, reduces a la mitad el valor inicial.

Acá tengo un homologo a tu código en C# y podrás ver, claramente, donde esta tu problema:

short b = (short.MaxValue / 2) + 1;

for (int t = (int)short.MaxValue + 1; t > 0; t = t/2) 
{
    Console.Write("t = {0}, tType = {2}, b = {1}, bType = {3}, ", t, b, t.GetType(), b.GetType());

    if ((b&t) !=0)
    {
        Console.Write("r = 1");
    }
    else
    {
        Console.Write("r = 0");
    }

    Console.WriteLine();
}

Console.WriteLine("---------------------------------------");

b = (short)(b+2);

for (long t = (long)int.MaxValue + 1; t > 0; t = t/2)
{
    Console.Write("t = {0}, tType = {2}, b = {1}, bType = {3}, ", t, b, t.GetType(), b.GetType());

    if ((b&t) != 0)
    {
        Console.Write("r = 1 ");
    }
    else
    {
        Console.Write("r = 0 ");
    }

    Console.WriteLine();
}

0voto

euriloco comentado

Gracias.
Mi duda es que al hacer un AND de un short (16 bits) y un long (64 bits) el resultado en consola me aparece de 32 bits (int).
No entiendo como me muestra eso en el segundo for y en cambio el primer for hace lo que espero que haga.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta