Operador bit a bit

5 respostas
edymrex

Tenho olhado no google mais não encontrei nada convincente sobre como usar operadores bit a bit
achei essa classe como exemplo:

package com.testes;

public class Testes 
{
	
	
	public static void main(String args[])
	{
	    int a = 10, b = 15, c = 20, d, e, h, i;
	    boolean  f, g, j = (a == b), k;
	    d = (a & b);
	    e = (a | b);
	    f = (j && (b == c));
	    g = (j || (b == c));
	    h = (a ^ b);
	    i = ~b;
	    k = !j;
	    System.out.println( d); //10
	    System.out.println( e); //15
	    System.out.println( f); //False
	    System.out.println( g); //False
	    System.out.println( h); //5
	    System.out.println( i); //-16
	    System.out.println( j); //False
	    System.out.println( k); //True
	
	}
	

}

Minhas dúvidas são as seguintes:
Nesta instrução
i = ~b;

O valor de b é 15, porque eu negando o valor ele vai pra -16 ?

d = (a & b);

O valor de a é 10 e o de b é 15, porque d recebe o menor que neste caso é 10 ?

e = (a | b);

Nesta operação já é o contrário recebe o maior entre a e b neste caso é 15 alguém sabe o porque ?

5 Respostas

victorwss

Puppets:

i = ~b;

O valor de b é 15, porque eu negando o valor ele vai pra -16 ?

. 15 = 0000 0000 0000 0000 1111 . -16 = 1111 1111 1111 1111 0000
Puppets:

d = (a & b);

O valor de a é 10 e o de b é 15, porque d recebe o menor que neste caso é 10 ?

15 = 0000 0000 0000 0000 1111 10 = 0000 0000 0000 0000 1010 15&10 = 0000 0000 0000 0000 1010
Puppets:

e = (a | b);

Nesta operação já é o contrário recebe o maior entre a e b neste caso é 15 alguém sabe o porque ?

15 = 0000 0000 0000 0000 1111 10 = 0000 0000 0000 0000 1010 15|10 = 0000 0000 0000 0000 1111

B

victorwss:
Puppets:

i = ~b;

O valor de b é 15, porque eu negando o valor ele vai pra -16 ?

. 15 = 0000 0000 0000 0000 1111 . -16 = 1111 1111 1111 1111 0000

… ou

~x == (-x)-1

ViniGodoy

Ou seja, a melhor maneira de aprender sobre operadores bit a bit é olhar os bits.
Não os valores decimais.

ViniGodoy

Para entender pq o negativo de 15 é -16 e não -15, estude sobre complemento de 2.

Na verdade, para que os números negativos e positivos fossem simétricos, deveria haver o número -0 e +0.

Considere que o primeiro bit representa o sinal:
1000 0000 representaria -0 e
0000 0000 representaria +0.

Optou-se então por retirar a forma negativa do 0 e usa-la para representar outro valor. No caso, um número negativo a mais. Por isso é que variáveis como byte vão de -128 até 127, e não -127 até 127.

T

http://en.wikipedia.org/wiki/Signed_number_representations indica que em alguns computadores antigos (IBM 7090, um predecessor dos mainframes) existia essa representação “sinal + magnitude” - o primeiro bit seria o sinal e o resto seria o valor - mas como ela era mais desajeitada para fazer contas (tradução: gastava mais hardware), foi substituída rapidamente pelo complemento de 2.
Mas os números de ponto flutuante realmente usam sinal + magnitude porque ela é melhor para fazer contas de multiplicação e divisão. O complemento de 2 é mais útil para fazer adições e subtrações.

Criado 15 de julho de 2008
Ultima resposta 15 de jul. de 2008
Respostas 5
Participantes 5