[C/C++]Trabajando con bits

Bueno seguro que es una pregunta MUY básica pero me vendría bien que me ayudaseis a ver un poco la luz :P

Quiero transformar una variable de 1Byte en una de 2Bytes.
Digamos que tengo la variable letra que contiene un caracter ASCII y este es su codigo binario:

letra = 1 0 1 0 1 1 0 1

Ahora quiero crear una nueva variable de 2 Bytes (16 bits) tal que quede así

letranueva = 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1

Es decir, la letra en binario va al final y el primer byte esta entero a 0.
Estoy trabajando en NDS con u8 y u16 pero la experiencia me dice que al hacerlo con un casting del u8 al u16 pone los bits vete tu a saber donde, en vez de dejarlos en su sitio.
A ser posible, que la solucion use los operadores >> y << para mover? bits.
Saludos y gracias :)
creo que sería así

nuevaletra=letra>>8;

EDIT: que tonto así es imposible! ajjaja que risa... bueno eesto si

nuevaletra=0x00001111&letra


prueba esto mejor
en C no se escriben literales binarias( creo ) , entonces lo que dice saulotmalo no funciona , sería:

nueva = letra & 0x00FF;

o

nueva = letra | 0x0000;

aunque no se si hay que tener en cuenta si la áquina es big o little endian.
gracias por la aclaracion estas en lo cierto, pero creo que la segunda opcion:

nueva = letra | 0x0000;

no me da buena espina, quieres decir que hará bien la mezcla suponiendo que cuando no hay operando es 0 o supondrá que es 1?
La verdad es que no estoy muy puesto en los operadores a bit , pero creo que funcionaría bien (supone que el resto de bits son 0).

En cualquier caso con el and creo que si funciona.

De todas maneras , sigo sin entender por que no funciona con una simple asignación:

nueva = 0;
nueva += letra;
El MALDITO problema esque funciona en el emulador perfectamente, pero en la propia Nintendo DS no sale correctamente, los tiles salen volteados cosa que solo pasa cuando se cambia uno de los bits del primer byte el cual pongo a cero SIEMPRE

Estoy desesperado... [enfa] , pero gracias por resolverme el principal problema ^^
Eso será (supongo [fies]) por qué el x86 es un little endian creo, y ARM es big endian (o al revés?), bueno, el caso es que lo has de poner al reves que en x86.

En el emulador se te ve bien por que corre sobre x86.
un voto a que el problema está en el litle endian.

en ese caso la solucion sería jugar con desplazamientos no?
aver, si quieres poner 1 1 0 1, pones 1 0 1 1 y ya.
lo he arreglado, el problema era la copia de datos a la VRAM
Lo he hecho de otra forma distinta (sin usar memcpy ni dmacopy, sino igualando directamente) y ya esta.

Gracias por la ayuda
Lupi escribió:lo he arreglado, el problema era la copia de datos a la VRAM
Lo he hecho de otra forma distinta (sin usar memcpy ni dmacopy, sino igualando directamente) y ya esta.

Gracias por la ayuda


En la VRAM de NDS tienes que leer/escribir datos de 16 bits, o si no obtienes resultados raros.

Si has visto mi programa de pasatiempos, yo en este programa lo que hago es reservar un area de la RAM de 256x512 y 8 bits, que luego copio como bitmap de fondo para las dos pantallas ( o sea, que cada pantalla utiliza 256x256 aunque en la NDS solo solo es visible un area de 256x192)

La idea de esto, es que todas las rutinas de dibujado operan sobre la RAM y por tanto, puedo trabajar con datos de 8 bits, que en mi caso es lo conveniente al estar utilizando paleta de 8 bits.
10 respuestas