Si può fare?

di il
20 risposte

Si può fare?

Ciao a tutti!!
Vi chiedo una mano per capire se le operazioni che ho in mente si posso fare in un modo efficiente.
Ecco il quesito:
Ho un numero Hex che voglio convertire in binario. Es. 0x0600 -> 0b0000011000000000 (16 bit)
Ora la parte che mi fa dannare. Il numero binario ottenuto vorrei rielaborarlo a coppie. La prima coppia con la quinta, la seconda con la sesta, la terza con la settima e la quarta con l'ottava.
Ovvero: 0b0000000001001000.
Come lo faccio senza usare milioni di righe di codice? considerando che il SW molto probabilmente sarà gestito da un pic.
Grazie a tutti per l'aiuto.

20 Risposte

  • Re: Si può fare?

    Usa le maschere dei bit utilizzando gli operatori unari.
  • Re: Si può fare?

    Ciao skynet,
    Grazie per la celerità della risposta. Ma forse mi stai sopravalutando. Non ho quelle competenze, il mio C è molto base..
    Comunque ora googlelerò un po con i tuoi consigli. Almeno è un punto di inizio.
  • Re: Si può fare?

    Non è questione di "sopravvalutare".

    Hai chiesto una cosa che si fa con strumenti che probabilmente ancora non conosci. Quindi, la strada che devi seguire adesso è lasciar perdere la scrittura del codice e studiare quello che ti manca.

    Non esistono strade alternative efficienti.

    Tanto per cominciare dovrai considerare il valore come se fosse in binario non devi convertire nulla.
  • Re: Si può fare?

    Allora se ho capito bene.
    Maschera e Bitwise And (usando 3):
    0b0000011000000000
    0b0000000000000011
    -------------------------
    0b0000000000000000<- 1° risultato -->(come faccio a prendere solo 2 zeri?)
    Poi shifto a dx di 2 bit: (avanti veloce, il prossimo passaggio è del quinto shift)
    0b0000000000000010
    0b0000000000000011
    -------------------------
    0b0000000000000010<- 5° risultato -->(stessa domanda di prima)
    Ora i risultati li carico in un array? in una variabile? conviene prendere i risultati come ho fatto negli esempi, oppure nell'ordine finale che mi serve?
    Grazie
  • Re: Si può fare?

    Esercizio:
    a = 0x0600
    b = (0x0600 & 0xC000) >> 0x0E
    c = (0x0600 & 0x3000) >> 0x0C
    d = (0x0600 & 0x0C00) >> 0x0A
    e = (0x0600 & 0x0300) >> 0x08
    f = (0x0600 & 0x00C0) >> 0x06
    g = (0x0600 & 0x0030) >> 0x04
    h = (0x0600 & 0x000C) >> 0x02
    i = 0x0600 & 0x0003
    Calcola i valori e poi vediamo la seconda parte
  • Re: Si può fare?

    La tesi di Church colpisce ancora: ogni funzione intuitivamente computabile E' computabile



  • Re: Si può fare?

    
    a = 0x0600
    b = (0x0600 & 0xC000) >> 0x0E = 0x0
    c = (0x0600 & 0x3000) >> 0x0C = 0x0
    d = (0x0600 & 0x0C00) >> 0x0A = 0x1
    e = (0x0600 & 0x0300) >> 0x08 = 0x2
    f = (0x0600 & 0x00C0) >> 0x06 = 0x0
    g = (0x0600 & 0x0030) >> 0x04 = 0x0
    h = (0x0600 & 0x000C) >> 0x02 = 0x0
    i = 0x0600 & 0x0003           = 0x0
    
  • Re: Si può fare?

    Trasforma tutto in binario a due bit.
    
    a = 0000 0110 0000 0000
    b = 
    c = 
    d = 
    e = 
    f = 
    g =
    h =
    i =
  • Re: Si può fare?

    skynet ha scritto:


    Trasforma tutto in binario a due bit.
    
    a = 0000 0110 0000 0000
    b = 00
    c = 00
    d = 01
    e = 10
    f = 00
    g = 00
    h = 00
    i = 00
    
  • Re: Si può fare?

    Quindi hai capito cosa abbiamo fatto?
  • Re: Si può fare?

    Ho un numero Hex che voglio convertire in binario. Es. 0x0600 -> 0b0000011000000000 (16 bit)
    il numero è già in formato binario,al massivo vorrai visualizzarlo in binario!
    Ora la parte che mi fa dannare. Il numero binario ottenuto vorrei rielaborarlo a coppie. La prima coppia con la quinta, la seconda con la sesta, la terza con la settima e la quarta con l'ottava.
    in che modo vorresti rielaborare i bit and,or,xor????
    hai 16 bit quindi da quel che dici elabori un byte(8 bit) con l'altro byte.?

    1234567812345678(16bit)
    0000011000000000

    0000011(primi 8 bit)
    bitwise operator
    0000000(sucessivi 8 bit)

    è uguale che fare

    00(prima coppia)
    bitwise operator
    00(quinta coppia)
    00(seconda coppia)
    bitwise operator
    00(sesta coppia)
    ...
    ..
    .
  • Re: Si può fare?

    skynet ha scritto:


    Quindi hai capito cosa abbiamo fatto?
    Fino a qui tutto ok.
    Preso il valore lo abbiamo scomposto a coppie di bit.
  • Re: Si può fare?

    vbextreme ha scritto:


    Ho un numero Hex che voglio convertire in binario. Es. 0x0600 -> 0b0000011000000000 (16 bit)
    il numero è già in formato binario,al massivo vorrai visualizzarlo in binario!
    Ok, ho usato male la parola convertire, stavo un po fuso a forza di 0 e 1.

    vbextreme ha scritto:


    in che modo vorresti rielaborare i bit and,or,xor????
    hai 16 bit quindi da quel che dici elabori un byte(8 bit) con l'altro byte.?
    No.
    Prima:
    1 2 3 4 5 6 7 8
    0x600 (00)(00)(01)(10)(00)(00)(00)(00)
    Dopo:
    1 5 2 6 3 7 4 8
    (00)(00)(00)(00)(01)(00)(10)(00) = 0x48
  • Re: Si può fare?

    Prima:
    1 2 3 4 5 6 7 8
    0x600 (00)(00)(01)(10)(00)(00)(00)(00)
    Dopo:
    1 5 2 6 3 7 4 8
    (00)(00)(00)(00)(01)(00)(10)(00) = 0x48
    
    out = (in & 0xC000) +                        // 1 rimane li
             ( (in & 0x3000) >> 2 ) +            // 2 scende di 2
             ( (in & 0x0C00 ) >> 4 ) +           // 3 scende di 4
             ( (in & 0x0300 ) >> 6  ) +          // 4 scende di 6
             ( (in & 0x00C0 ) << 6 ) +           // 5 sale di 6
             ( (in & 0x0030 ) << 4 ) +             // 6 sale di 4
             ( (in & 0x000C ) << 2 ) +             // 7 sale di 2
             (in & 0x0003 );                          // 8 rimane li
    
Devi accedere o registrarti per scrivere nel forum
20 risposte