visual entero data built c# bit-manipulation bit-shift

c# - entero - Desplazamiento del bit izquierdo 255(como un byte)



primitive types c# (7)

¿Has intentado lanzarlo?

byte b = (byte)(255 << 1)

Este es un enfoque interesante: el código anterior funcionará si se envuelve en un bloque unchecked como este:

unchecked { byte b = (byte)(255 << 1); }

Dado que unchecked está unchecked el valor se trunca al valor deseado de 254. ¡Así que es posible hacerlo con una conversión!

¿Alguien puede explicar por qué lo siguiente no compila?

byte b = 255 << 1

El error:

El valor constante ''510'' no se puede convertir en un ''byte''

Estoy esperando lo siguiente en binario:

1111 1110

La conversión de tipos me ha dejado perplejo.


El resultado del operador << es un Int32 , no lo que pones en él.

Debe emitir el resultado del cambio, no la entrada. Además, producirá un desbordamiento (es más grande que un byte después de todo), por lo que debe especificar que necesita una conversión no verificada.

En otras palabras, esto funcionará:

Byte b = unchecked((Byte)(255 << 1));


Está cambiando 255 por 1 bit, y luego intenta asignarlo a un byte. 255 << 1 is 510 , y 510 no encaja en un byte.


Los literales numéricos en C # son int , no byte (y el cambio de bit será evaluado por el compilador, por lo tanto solo quedan los 510). Por lo tanto, está intentando asignar un valor a un byte que no se ajusta. Puedes enmascarar con 255:

byte b = (255 << 1) & 0xFF

Para reducir el resultado a 8 bits de nuevo. A diferencia de Java, C # no permite desbordamientos no detectados. Básicamente, tendría dos opciones razonables al tratar de asignar 510 a un byte: Oprima en el valor máximo, luego obtendrá 255, o deseche los bits que no encajan, en cuyo caso obtendría 254.

También puede utilizar unchecked marcar , como lassevk mencionó :

byte b = unchecked((byte)(255 << 1));


Y como << tiene una prioridad más alta que & puede guardar los corchetes:

byte b = 255 << 1 & 0xff;


byte b = 0xff & (255 << 1);


255 << 1

le dará más de un byte.