2010-11-08 11 views
6

In un'intervista a una mia amica è stata posta questa domanda. Non ero in grado di capire una soluzione a questo. Domanda -Domanda intervista: numero di bit swap necessari per convertire un numero intero in un altro

Scrivere una funzione per calcolare il numero di bit swap richiesti per convertire un intero in un altro.

+0

Esiste una lingua particolare? –

+0

È noto che entrambi gli interi hanno lo stesso numero di bit 0 e lo stesso numero di 1 bit? – Omnifarious

+0

@Omnifarious - Nessuna informazione non è nota – user450090

risposta

7

L'operazione bit che può essere utilizzato per capire quali bit sono differenti è xor.

Ogni 1 nel xor dirà il diverso bit tra i due numeri interi.

int getBitSwapCount (int x, int y) {

int count = 0; 

for(int z = x^y; z!=0; z = z>> 1) 
{ 
    count += z & 1; 
} 
return count; 

}

+0

Non corretto. :-) Non vogliono il numero di bit diversi, ma il numero di scambi. – Omnifarious

+6

Il numero di bit diversi è uguale al numero di scambi richiesti – user450090

+0

@Onnmusico && @utente45 *: sì, il numero se i bit diversi devono essere uguali al numero di scambi necessari –

3

Le domande per le interviste non riguardano solo le soluzioni, ma sono anche (e in genere è ancora più importante trovare una soluzione) dandoti l'opportunità di mostrare come affrontare un nuovo problema come questo. Come inizieresti su questo? C'è qualche ulteriore informazione che vorresti sapere per aiutarti a risolverlo? Ci sono delle funzioni standard (in qualsiasi linguaggio di programmazione comunemente usato) che vorresti usare?

Dacci il tuo colpo migliore, giocheremo l'intervistatore (s) e tempestiva, come si va ...

0

non riesco a vedere nulla di speciale in questa domanda. Iterando sui bit di entrambi gli interi, combinando i bit attuali tramite XOR e incrementando un contatore se il risultato non è uguale a zero, si otterrà il numero di bit che differiscono in entrambi i valori.

2

XOR i valori e poi contare il numero di quelli nel risultato

+1

Perché zeri? se x1 = 0 e x2 = 0 allora x1 xor x2 = 0, cioè tutte le posizioni sono zeri, ma non sono necessari swap. Possono essere conteggiati? – ffriend

0

approccio diverso

find e la stringa binaria e calcolare Levenshtein distance dalla programmazione dinamica

0

Prendere il XOR di 2 numeri (per esempio un & b), e contare il numero di quelle in un^b

int bitsSwapRequired (int a, int b){ 
    int count = 0; 
    for (int c = a^b; c!=0 ; c >> 1) 
     count += c & 1; 
    return count; 
} 

Possiamo fare un po 'meglio, piuttosto che semplicemente spostando c ripetutamente mentre si controlla il bit meno significativo, possiamo continuamente capovolgere il bit più a destra impostato su 1 e contare quanto tempo ci vuole per raggiungere 0. L'operazione c = c & (c-1) cancellerà il bit più a destra impostato su 1 in c.

int bitsSwapRequired (int a, int b){ 
    int count = 0; 
    for (int c = a^b; c != 0; c = c & (c-1)) 
     count ++; 
    return count; 
} 
Problemi correlati