Dúvida em método que usa operadores de deslocamento de bits

3 respostas
L

O método gn envolve operadores de deslocamento de bits e não estou conseguindo entender como isso funciona no método.
obrigado pela atenção.

att.

Class nurikabe{

static int[][] gn(int ordem, int N){
    int[][] m=new int[N][N];
    int bit;
    for(int j=0; j<N; j++){
      for(int k=0; k<N; k++){
        bit = ordem & 1;           // quais valores retornarão para estas duas
        ordem = ordem >> 1;   // variáveis int? 
        m[j][N-k-1]=bit;           
     }
    }
    return m; // qual será esse return? 
  }

  public static void main(String[] arg){
    int[][] m;
    int N=2;
    int cnt=0;
    for(int i=0; i<Math.pow(2,N*N); i++){
      m=gn(i, N); // repassa 0, 1
      if(!bloco2x2(m) & rioUnico(m)){
        cnt++;
        System.out.println("Nurikabe #"+cnt+"   **********");
        imprime(m);
      }
    }
  }
}

3 Respostas

ViniGodoy

Primeiro de tudo, você sabe o que esses operadores fazem?

Imagine um número qualquer:

1010 0101

Fazer esse número & 1 é o mesmo que fazer:

1010 0101 &
0000 0001

Nesse caso, irá retornar 1 se o último bit for 1, 0 se o último bit for 0.

O próximo >> 1, afasta 1 bit para direita todos os bits da sequência:

1010 0101 >> 1
01010 010 >> 1
001010 01

Acho que com isso você já consegue captar o que esse método está fazendo. Ele está simplesmente guardando o valor de cada bit da matriz em uma posição diferente do vetor. Agora, não procurei entender que posição é essa (aquele calculo maluco ali), até pq vc só perguntou sobre os operadores bitwise.

L

Olá ViniGodoy,

desculpa pela demora em responder, só consegui tempo para ler a sua ajuda hoje =)

Olha o que estou entendendo,

bit = ordem & 1;          // 0 & 1 == 0          
         ordem = ordem >> 1;       // 0 >> 1 == 0   
         m[j][N-k-1]=bit;          // aqui estou em dúvida: se m[0][2-0-1] = 0 == m[0][1] = 0, qual será o valor ou posição que o 0 da variável bit irá ocupar no arranjo de ints m? e qual será o return?
  
          return m;

T+!

ViniGodoy

Bom, isso seria difícil de entender sem conhecer o que significam suas variáveis N e ordem. Eu também não sei jogar Nurikabe, então, fica difícil deduzir que lógica é essa. :cry:

Criado 27 de outubro de 2009
Ultima resposta 30 de out. de 2009
Respostas 3
Participantes 2