duda lenguaje c (solucionado)

alguein me explica por favor que significa esta linea ?

PORTB &= ~(1<<SPI_CS);

Pues mira &= es una and binario compuesto, el simbolo ~ es un not binario y << es desplazamiento de bit a la izquierda, por tanto me parece que lo que realiza seria lo siguiente:

PORTB = PORTB && (~(1<<SPI_CS));

Es decir hace una and binaria entre lo que hay en PORTB y lo que hay en el registro SPI_CS desplazado un bit a la izquierda pero negado y lo guarda en PORTB.

asias ¡

de nada para eso estamos!! me alegro de que lo solucionaras. un saludo

Regata:
Pues mira &= es una and binario compuesto, el simbolo ~ es un not binario y << es desplazamiento de bit a la izquierda, por tanto me parece que lo que realiza seria lo siguiente:

PORTB = PORTB && (~(1<<SPI_CS));

Es decir hace una and binaria entre lo que hay en PORTB y lo que hay en el registro SPI_CS desplazado un bit a la izquierda pero negado y lo guarda en PORTB.

'Regata' me confundo si lo que querías poner en realidad y tal y como perfectamente explicas es:

PORTB = PORTB & (~(1<<SPI_CS));

coLe.

Pues yo no estoy de acuerdo, para variar..... je,je,je

lo que hay en el registro SPI_CS desplazado un bit a la izquierda

SPI_CS es el numero de bits a desplazar=><< - Arduino Reference
(variable << number_of_bits)

:wink:

'Igor R' ¡Qué razón tienes!

¿Se podría resumir así?

PORTB &= ~(1<<SPI_CS); //Pone a cero el bit que ocupa la posición indicada en SPI_CS del valor contenido por PORTB.

coLe.

Eso me suena mejor... :wink:

Aunque un Serial.println(PORTB,BIN) y/o un Serial.println(~(1<<SPI_CS),BIN), sirve para aprender lo que hacen estas cosas...

:slight_smile:

buena explicación, todavia no he tendido que enfrentarme a todo esto de bitshift, pero creo que deberia cogerme unos ejemplos y ver que utilidad real tiene porque igual me estoy perdiendo algo importante jeje.

gracias por la explicación Igor

Es muy usado para multiplicar/dividir por factores de 2.
Y lo ves a menudo para configuracion de registros del micro, ya que tienes un include con todos los nombres de registros y bits del micro (igual que el datasheet). Entonces haces cosas del tipo:
ADMUX=(1<<ADLAR)|(0<<REFS1)|(1<<REFS0)|(0<<MUX3)|(1<<MUX2)|(0<<MUX1)|(1<<MUX0);
o como el ejemplo que ha puesto SrDonGato.
Tambien para poder juntar varios bytes en una variable, mascaras, etc

:wink:

Sí se me colo un & pero sí era eso lo que quería poner, el SPI_CS pensé que era un registro, no habia mirado en el datasheet, pero si es una variable pues eso mismo. Lo de mirar con el Serial.print siempre ayuda mucho para depurar los programas.

Os dejo un enlace a un tuto de AVRfreaks que lo explica todo todo todo

http://www.avrfreaks.net/index.php?name=pnphpbb2&file=viewtopic&t=37871