PDA

Visualizza la versione completa : C++: come inserire un bit a destra di una stringa???


Svarowsky_girl
08-01-2013, 12:34
Ciao a tutti,
Mi chiedevo se qualcuno poteva essere così gentile da aiutarmi a risolvere un piccolo problema.
In pratica ho creato un listato istruzioni che mi permette di agire su un registro a 8 bit tramite la sua parità: calcola il numero di 1 presenti, verifica se sono in numero pari o dispari... Ora, l'unica cosa mancante è l'aggiunta del corrispettivo nono bit a destra del registro (1 se il numero di bit=1 nel registro sono in numero dispari, 0 per il caso di un numero pari di bit=1).
LA mia domanda è: quale istruzione mi permette di aggiungere questo bit?
pensavo allo shift, ma penso che >> mi permeyta di muovei tra i bit e non di aggiungerli!

grazie in anticipo!!!

escocat
08-01-2013, 13:16
Fai lo shift e poi, se è il caso, sommi 1 al risultato!

c0der
08-01-2013, 13:59
Ponendo che il tuo registro sia abbastanza grande da contenere 9 bit (io ho ecceduto e ho usato un int)
per settare a 1 un qualunque bit (in questo caso il nono) puoi usare:



#include <stdio.h>

int main()
{
int maschera = 0;

printf("maschera: %d\n", maschera);

// setto a 1 il nono bit
maschera |= 1 << 8;

printf("maschera: %d\n", maschera);

return 0;
}


Ciao.

Svarowsky_girl
08-01-2013, 16:41
Originariamente inviato da escocat
Fai lo shift e poi, se è il caso, sommi 1 al risultato!

Prima di tutto grazie per la risposta :) ... Allora, se faccio lo shift in questo modo
ADRESH>>1 ottengo solo che la mia stringa di bit viene shiftata a destra di un unità,esempio:
se il mio ADRESH=00000011 , usando lo shift di un bit ottengo il nuovo ADRESH=00000001. Come vedi sempre 8 bit rimangono... E non posso sommare 1 al risultato, perderebbe di significato!

Non so come aggiungere proprio un nono bit :bhò:

Svarowsky_girl
08-01-2013, 17:05
Originariamente inviato da c0der
Ponendo che il tuo registro sia abbastanza grande da contenere 9 bit (io ho ecceduto e ho usato un int)
per settare a 1 un qualunque bit (in questo caso il nono) puoi usare:



#include <stdio.h>

int main()
{
int maschera = 0;

printf("maschera: %d\n", maschera);

// setto a 1 il nono bit
maschera |= 1 << 8;

printf("maschera: %d\n", maschera);

return 0;
}


Ciao.



Ciao e grazie mille per la risposta :ciauz: ... allora,io sto gestendo LA COMINUCAZIONE SERIALE 8-E-1 di un uC, il PIC18F4450; il mio professore vuole che venga calcolato il bit di parità; nel flag del trasmettitore e ricevitore ho già attivato la trasmissione e ricezione con il 9bit di parità.
Quindi, dopo vari passaggi il mio registro ADRESH dovrebbe avere 9 bit, giusto?
Con questo tuo metodo maschera |= 1 << 8; in poche parole che succede? Perchè stai facendo la OR? Scusa le mie domande stupide :zizi:

c0der
08-01-2013, 17:22
Originariamente inviato da Svarowsky_girl
Quindi, dopo vari passaggi il mio registro ADRESH dovrebbe avere 9 bit, giusto?

Questo registro ADRESH quanti bit è? attualmente come lo scrivi?


Con questo tuo metodo maschera |= 1 << 8; in poche parole che succede?
Qui ti ho solo fatto vedere come settare un qualunque bit di un intero a 1.
1) Con lo shift ottengo un numero che ha il bit settato a 1 che mi interessa, ad esempio 1 << 8 è 256 ossia 100000000 in binario.
2) Facendo l'OR tra 256 e maschera => ottengo uno maschera con il nono bit a 1.

Se volevo settare il 13esimo bit scrivevo:
maschera |= 1 << 12;

Svarowsky_girl
08-01-2013, 17:32
Originariamente inviato da c0der
Questo registro ADRESH quanti bit è? attualmente come lo scrivi?


Qui ti ho solo fatto vedere come settare un qualunque bit di un intero a 1.
1) Con lo shift ottengo un numero che ha il bit settato a 1 che mi interessa, ad esempio 1 << 8 è 256 ossia 100000000 in binario.
2) Facendo l'OR tra 256 e maschera => ottengo uno maschera con il nono bit a 1.

Se volevo settare il 13esimo bit scrivevo:
maschera |= 1 << 12;

AlLora, in pratica il registro ADRES (16bit) è un registro dove memorizzo il risultato di una conversione A/D edè suddiviso in ADRESH e ADRESHL , ognuno da 8bit, rispettivamente registro dei bit al ata priorità e bassa. A me interssa l'adresh, infatti ho inserito al suo interno il risultato della conversione trasmessa.
Poichè ho attivato il flag del 9bit, allora avro' il suo contenuto a 9bit :old: (spero sia giusto).

il registro è scritto semplicemente ADRESH, lo riconosce il microcontrollore.

Per quanto riguarda la tua maschera...quindi una volta calcolata questa maschera come la applico all'ADRESH? SOMMANDOLA? :)

c0der
08-01-2013, 17:53
Prendendo ad esempio qui:
http://www.microcontroller.it/T&T/PIC/ADRESHL.htm
adresh e adresl sono contigui.

Parlare del nono bit ha senso se li intendi contigui, perché essendo ciascuso di 8 bit non avrebbe senso di parlare del nono bit.

Rispetto al disegno nell'esempio tu come li scrivi i dati?

Svarowsky_girl
08-01-2013, 18:03
Originariamente inviato da c0der
Prendendo ad esempio qui:
http://www.microcontroller.it/T&T/PIC/ADRESHL.htm
adresh e adresl sono contigui.

Parlare del nono bit ha senso se li intendi contigui, perché essendo ciascuso di 8 bit non avrebbe senso di parlare del nono bit.

Rispetto al disegno nell'esempio tu come li scrivi i dati?

Sì, scusami, i registri sono contigui... ciascuno da 8 bit, ma contigui.
Nell'esercizio mi è richiesto espressamente di inserire nell'ADRESH gli 8 bit piu significativi della conversione A/D, e di calcolare il bit di parità sul registro ADRESH :old:.

c0der
08-01-2013, 18:19
Questo bit di parità lo dovrai allora scrivere in ADRESL, visto che gli 8 bit dell'ADRESH li utilizzi già.

- se devi scrivere 1 nel bit meno significativo di ADRESL:
ADRESL = 1
- se devi scrivere 1 nel bit più significativo di ADRESL:
ADRESL = 128
(128 = 10000000 in binario)

Loading