5 votos

Cómo encontrar las sumas únicas en los valores 1,2,4,8,16, 32

Pido disculpas, pero no estoy seguro de lo que usted podría incluso llamar a este problema. Tengo algunos datos que proporcionan un código numérico para la carrera de la siguiente manera:

hispano(1) + american_indian_or_alaska_native(2) + asiáticos(4) + black_or_african_american(8) + native_hawaiian_or_other_pacific_islander(16) + blanco(32)

Así, por ejemplo, un 5 representa a una persona que se identifica como los Asiáticos y los Hispanos (4 + 1), y un 25 representa a una persona que se identifica como de las islas del Pacífico, Negros e Hispanos (16 + 8 + 1).

Estoy tratando de escribir un programa que va a recuperar lo que las carreras están presentes desde el número dado. Me imagino que debe ser una ecuación que puede determinar la combinación sin detallando cada combinación única, pero yo podría estar equivocado! Traté de pensar acerca del uso de modulo pero no llegué muy lejos.

Gracias, y si tienes sugerencias para las etiquetas, por favor, comentarios como no estoy seguro de que esto encaja en matemáticas.

*editar Gracias a todos! Esto realmente me ayudó a pensar sobre el problema y generar una solución eficiente. Responder a mi pregunta no depender del uso de SAS, pero aquí está el código SAS terminé usando, que creo que muestra de forma intuitiva cómo resolver el problema:

data want; 
    set have; 

/* convert decimal to 6-place binary */
    eth_bin = put(ethnicity, binary6.);  

/* if 1st digit is 1 then race is present, and so on*/ 
    if substr(eth_bin, 1, 1) = 1 then white = "Yes"; 
    if substr(eth_bin, 2, 1) = 1 then pacific_islander = "Yes"; 
    if substr(eth_bin, 3, 1) = 1 then black = "Yes"; 
    if substr(eth_bin, 4, 1) = 1 then asian = "Yes"; 
    if substr(eth_bin, 5, 1) = 1 then american_indian = "Yes"; 
    if substr(eth_bin, 6, 1) = 1 then hispanic = "Yes"; 
run; 

9voto

Colm Bhandal Puntos 2719

Observe que los números de $1, 2, 4, 8, 16, 32$ todas son perfectas poderes de $2$. Esto significa que a partir de la suma de ellos, los componentes individuales siempre se pueden recuperar porque no hay una única manera de expresar un número como un número binario. Una manera de recuperar la raza info se siguen dividiendo por $2$ y conseguir el resto. Cada resto de $1$ indica una cierta raza (dependiendo de la etapa de división). Si el resto es $0$, que la raza no está presente. Elaborar, aproximadamente, de seguir este algoritmo:

  1. Deje $n$ ser su número con la raza info.
  2. Mientras que $n$ es distinto de cero, volver a asignar $n$ $\lfloor \frac{n}{2} \rfloor$y hacer una nota de el resto. Si el resto es $1$, luego de que la raza está presente, donde la carrera comienza a las Hispana y así sucesivamente.
  3. Al $n=0$ está terminado, no hay más razas.

Actualización: Henning Makholm sugerencias para el uso de operadores bit a bit es de hecho una solución más elegante, mediante programación, pero puede ser más difícil de captar intuitivamente.

7voto

sewo Puntos 58

En base a tu ejemplo, creo que la sintaxis SAS correcta hacerlo por la manipulación de bits sería algo así como

if BAND(ethnicity, 32) ^= 0 then white = "Yes"; 
if BAND(ethnicity, 16) ^= 0 then pacific_islander = "Yes"; 
if BAND(ethnicity, 8) ^= 0 then black = "Yes"; 
if BAND(ethnicity, 4) ^= 0 then asian = "Yes"; 
if BAND(ethnicity, 2) ^= 0 then american_indian = "Yes"; 
if BAND(ethnicity, 1) ^= 0 then hispanic = "Yes"; 

Tenga en cuenta que esto funciona porque

 1 = blshift(1,0)
 2 = blshift(1,1)
 4 = blshift(1,2)
 8 = blshift(1,3)
16 = blshift(1,4)
32 = blshfit(1,5)

que podría venir bien si necesita realizar el procesamiento más complejo donde un lazo sería mejor que repetir el mismo código seis veces.

2voto

rretzbach Puntos 116

Qué es mirar sus números en binario. Por ejemplo, $$ 5_ {10} = 101_ {2} $$ por lo que hispanos y asiáticos sería verdadero, todos los demás--falso.

1voto

Kay K. Puntos 4197

$$0\leq N\leq63$$ $$N=\sum_{k=0}^{5}a_k\cdot 2^k$$ $$a_5 = \left[\frac{N}{2^5}\right]$$ $$a_4 = \left[\frac{\mod (N,2^5)}{2^4}\right]$$ $$...$$ $$a_k = \left[\frac{\mod (N,2^{k+1})}{2^k}\right]$$ $$...$$ $$a_0 = \left[\frac{\mod (N,2)}{1}\right]$$

Esto puede hacerse simultáneamente para todos los $k$. (No hay necesidad de esperar para el resto de la etapa anterior).

1voto

Brian Puntos 1762

Abra Microsoft Excel. Tipo $DEC2BIN(5)$, por ejemplo, si el $5$ es el número de la persona. Cada $1$ o $0$ te dice si la persona pertenece a la raza o no.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X