usar unario sharp relacionales operadores operador logicos jerarquia ejemplos condiciones como asignacion c# operators

unario - operadores logicos c# ejemplos



¿Qué significa el operador "<<" en C#? (9)

Estaba haciendo una programación básica de audio en C # usando el paquete NAudio y me encontré con la siguiente expresión y no tengo idea de lo que significa, ya que nunca antes había visto el operador <<. Entonces, ¿qué significa <<?

Por favor, dé una explicación rápida de esta expresión.

short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);


Definición

El operador de desplazamiento a la izquierda (<<) cambia su primer operando a la izquierda por el número de bits especificado por su segundo operando. El tipo del segundo operando debe ser un int. << Operador (Referencia de MSDN C #)

Para números binarios, es una operación bit a bit que desplaza todos los bits de su operando; cada bit en el operando simplemente se mueve un número dado de posiciones de bit, y las posiciones de bit vacantes se completan.

Uso

Los cambios aritméticos pueden ser útiles como formas eficientes de realizar la multiplicación o división de enteros con signo por potencias de dos. El desplazamiento hacia la izquierda de n bits en un número binario con signo o sin signo tiene el efecto de multiplicarlo por 2 n . Al cambiar a la derecha por n bits en un complemento de dos, el número binario firmado tiene el efecto de dividirlo por 2 n , pero siempre redondea hacia abajo (hacia el infinito negativo). Esto es diferente de la forma en que el redondeo se hace generalmente en la división de enteros con signo (que redondea hacia 0). Esta discrepancia ha provocado errores en más de un compilador.

Otro uso es trabajar con bits de color . El artículo de Charles Petzold Foundations "Bitmaps y Pixel Bits" muestra un ejemplo de << cuando se trabaja con colores:

ushort pixel = (ushort)(green << 5 | blue);



Como algunas personas ya han señalado, se trata de una operación de cambio.

Sin embargo , vale la pena señalar que, dependiendo de si el operando es un tipo integral con signo o un tipo integral sin signo, se aplicará un desplazamiento aritmético o lógico.

Ver la parte inferior de esta página en msdn.


Como otros han dicho, el operador << mueve los bits de un número que queda. La razón normal por la que alguien haría esto en una aplicación de audio es combinar dos muestras mono de 8 bits (una para izquierda y derecha) en una muestra de sterio de 16 bits.

Entonces, en el código de muestra, parece que Buffer contiene sterio codificado con la izquierda y la derecha en muestras alternativas. Al desplazar la primera izquierda 8 y oring la segunda, el autor las combina para formar una muestra de sterio de 16 bits, siendo High 8bits un canal y los 8bits bajos el otro.

Si en tu ejemplo el buffer contiene:

1001 0100 (Right) 1001 0011 (Left)

El resultado que obtendrá en la muestra es:

(Left) (Right) 1001 0011 1001 0100


El "<<" es un operador de desplazamiento a la izquierda. x << y cambia el patrón de bits x posición y queda.

Por ejemplo, si x era 0001 0101 e y era 1, el resultado sería 0010 1010 . Es como si alguien empujara cada bit que dejó uno.


El operador bit a bit ya ha sido explicado varias veces. Digamos que el buffer[0] contiene 1 , el buffer[1] contiene 2 y el index es 0 y reemplaza estos valores:

short sample = (short)((buffer[1] << 8) | buffer[0]); short sample = (short)((1 << 8) | 2);

Ahora, una representación semi-gráfica. Este es el número 1 en una representación binaria:

0000 0001

Al desplazar ocho posiciones hacia la izquierda, este número se "desbordará" de un solo byte. Sin embargo, el compilador es lo suficientemente inteligente como para darnos más espacio.

0000 0001 0000 0000

Ahora, la parte correcta: el número 2 se ve así en binario:

0000 0010

Y el "|" operador (OR a nivel de bit) hace que los dos valores se junten y comparen bit por bit.

0000 0001 0000 0000 | 0000 0000 0000 0010 = 0000 0001 0000 0010

Y el valor final se almacena en su variable "muestra" (en este caso, 258.) La operación inversa es similar:

buffer[0] = sample & 255; buffer[1] = (sample & (255 << 8)) >> 8;



Se llama operador de desplazamiento a la izquierda.

Siga this enlace para obtener información más detallada.


Shift left (y la contraparte, Shift right) mueve los bits en la dirección dada.

Shift left es más o menos multiplicado por 2, pero más rápido

Shift right está más o menos dividido por 2, pero más rápido