10bits (500 valores)
Eso equivale a un minimo de 5000bits, un char que es de 8 bits no alcanza para representar los 10, lo mas simple en este caso es usar variables de 16 bits.
Ahora 500 valores es bastante, son 1000 bytes (en 16bits) por lo que si, tenes el 50% del valor ocupado de tu RAM de comienzo.
Por un lado tenes eso.
Por otro lado para acceder bit a bit, podes crear un programa, en que reciba el numero de bit a leer (siendo el primero el 0), de alli lo divida por 8, el resultado te va a dar en que byte se encuentra y luego el resto te va a dar la posicion del bit.
Por ejemplo el valor 9, tendrias que al dividirlo por 8 ( rotar 3 veces a la derecha ) es de 1, y el resto es 1, entonces usando un array de 8bits (char) podes obtener el valor de ese bit. Y eso te ocuparia unos 125bytes.
Dejando unicamente 2048 - (1000 + 125 ) = 923 bytes para el micro ( variables/stack/etc )
Pienso que dentro de tenes un 45% destinado a eso.
--------------------------------------------------------------
Como sé que tengo memoria suficiente, (más del 50% destinada solo para este array) hay alguna forma de eliminar el array y crear uno nuevo con un tipo distinto? teniendo en cuenta que la cantidad de memoria es exactamente igual?
No tenes memoria dinamica, pero si estas dispuesto a "eliminar" el array para poder poner otro array, entonces quiere decir que no tenes problema de REUTILIZAR el mismo array para cualquiera de los valores ( sean los de 10bits o los de 1bit)
La diferencia aca es que vas a crear 1000 posiciones de un array de 8bits, y luego con punteros, castearlo a 16bits cuando quieras almacenar y usar los de 10bits. Aunque ahora valores de 1 bits vas a poder guardar 1000 * 8 = 8000 si usas el metodo que nombre antes en el mismo array.
Eso si, o es el array con valores de 10bits o es el de 1bits.
El tema es que si o si vas a ocupar esos 50%, a no ser que puedas almacenar menos valores.