elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Acceder a bits de un array.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Acceder a bits de un array.  (Leído 2,886 veces)
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Acceder a bits de un array.
« en: 23 Octubre 2012, 16:27 pm »

¿Es correcta esta forma de acceder a los bits de un array?

Código
  1. _Bool bit(char *a, int b)
  2. {
  3.  int index = (b/8)-1;
  4.  if(b%8) index++;
  5.  if((a[index]>>(8-(b%8)))%2) return true;
  6.  return false;
  7. }

a es un puntero a un array de chars a cuyos bits se quiere acceder y b el numero del byte al que se quiere acceder.
Seguramente se puede hacer mas facil, ultimamente he tenido examenes y ando un poco espeso xD

Saludos.


En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Acceder a bits de un array.
« Respuesta #1 en: 23 Octubre 2012, 17:50 pm »

El desplazamiento dentro del byte depende de como lo interpretes lo usual es no hacerlo. Esa función se puede acortar un poco. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h> /* div_t, div */
  3. #include <limits.h> /* CHAR_BIT */
  4.  
  5. _Bool bit(unsigned char *a, int pos);
  6.  
  7. int main(void)
  8. {
  9.   unsigned char test = 131;
  10.   int i;
  11.  
  12.   for (i = CHAR_BIT - 1; i >= 0; i--)
  13.      printf("%2d", i);
  14.   putchar('\n');
  15.   for (i = CHAR_BIT - 1; i >= 0; i--)
  16.      printf("%2d", bit(&test, i));
  17.   putchar('\n');
  18.  
  19.   return EXIT_SUCCESS;
  20. }
  21.  
  22. _Bool bit(unsigned char *a, int pos)
  23. {
  24.   div_t d = div(pos, CHAR_BIT); /* .quot = byte, .rem = bit */
  25.  
  26.   return a[d.quot] >> d.rem & 1;
  27. }

Y su salida (con lo usual, ocho bits por byte) es:
Código:
 7 6 5 4 3 2 1 0
 1 0 0 0 0 0 1 1

Otra opción es utilizar directamente los operadores de división y modulo.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Acceder a bits de un array.
« Respuesta #2 en: 23 Octubre 2012, 18:30 pm »

El desplazamiento dentro del byte depende de como lo interpretes lo usual es no hacerlo. Esa función se puede acortar un poco. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h> /* div_t, div */
  3. #include <limits.h> /* CHAR_BIT */
  4.  
  5. _Bool bit(unsigned char *a, int pos);
  6.  
  7. int main(void)
  8. {
  9.   unsigned char test = 131;
  10.   int i;
  11.  
  12.   for (i = CHAR_BIT - 1; i >= 0; i--)
  13.      printf("%2d", i);
  14.   putchar('\n');
  15.   for (i = CHAR_BIT - 1; i >= 0; i--)
  16.      printf("%2d", bit(&test, i));
  17.   putchar('\n');
  18.  
  19.   return EXIT_SUCCESS;
  20. }
  21.  
  22. _Bool bit(unsigned char *a, int pos)
  23. {
  24.   div_t d = div(pos, CHAR_BIT); /* .quot = byte, .rem = bit */
  25.  
  26.   return a[d.quot] >> d.rem & 1;
  27. }

Y su salida (con lo usual, ocho bits por byte) es:
Código:
 7 6 5 4 3 2 1 0
 1 0 0 0 0 0 1 1

Otra opción es utilizar directamente los operadores de división y modulo.

Un saludo

Gracias por la respuesta, muy buena.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Acceder a bits de un array.
« Respuesta #3 en: 23 Octubre 2012, 23:43 pm »

una pregunta que es lo que quieres hacer exactamente? modificar los bits de un byte? esto se suele hacer aplicando mascaras al byte. por ejemplo, si tienes un byte inicial:
Código:
a = 10000001
y quieres poner a 0 el MSB para que quede asi:
Código:
b = 00000001
lo que deberias hacer es aplicar la siguiente mascara:
Código:
b = a & 0x7F
con lo que estarias poniendo a 0 el bit mas significativo, y dejando igual a los demas. si ahora quisieras volver a ponerlo a 1, deberias aplicar la siguiente mascara:
Código:
c = b | 0x80

lo digo porque no creo que hagan falta librerias externas y demas para acceder a los bits, ya que con los operadores que trae hay mas que suficiente para muchisimas aplicaciones. si tienes alguna pregunta ya diras...

espero que te sirva de ayuda, un saludo!
« Última modificación: 23 Octubre 2012, 23:45 pm por xiruko » En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Acceder a bits de un array.
« Respuesta #4 en: 24 Octubre 2012, 16:01 pm »

una pregunta que es lo que quieres hacer exactamente? modificar los bits de un byte? esto se suele hacer aplicando mascaras al byte. por ejemplo, si tienes un byte inicial:
Código:
a = 10000001
y quieres poner a 0 el MSB para que quede asi:
Código:
b = 00000001
lo que deberias hacer es aplicar la siguiente mascara:
Código:
b = a & 0x7F
con lo que estarias poniendo a 0 el bit mas significativo, y dejando igual a los demas. si ahora quisieras volver a ponerlo a 1, deberias aplicar la siguiente mascara:
Código:
c = b | 0x80

lo digo porque no creo que hagan falta librerias externas y demas para acceder a los bits, ya que con los operadores que trae hay mas que suficiente para muchisimas aplicaciones. si tienes alguna pregunta ya diras...

espero que te sirva de ayuda, un saludo!

stdlib es una libreria del estandar, no es nada externo. Y si tengo una pregunta, ¿de donde sacas las mascaras? Si no utilizo ni siquiera la libreria del estandar pues mejor.

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Acceder a bits de un array.
« Respuesta #5 en: 24 Octubre 2012, 17:20 pm »

Citar
stdlib es una libreria del estandar, no es nada externo.

cierto, no lo dije como deberia haberlo hecho. me referia mas bien a que no hace falta usar ninguna libreria para hacer esto que comentas.

Citar
Y si tengo una pregunta, ¿de donde sacas las mascaras?

no se si lo sabras, pero para pasar de binario a hexadecimal se cogen los bits en grupos de 4 (por lo que tienes un valor de 0 a 15 para cada agrupacion) y se pasa directamente al caracter hexadecimal. por ejemplo:

Código:
 decimal: 12 -> binario: 0000(0) 1100(12 = C hex) -> hexadecimal: 0x0C
decimal: 67 -> binario: 0100(4) 0011(3) -> hexadecimal: 0x43
decimal: 179 -> binario: 1011(11 = B hex) 0011(3) -> hexadecimal: 0xB3

luego en cuanto a las mascaras, las mas simples son una AND (&) o una OR (|). para una AND, el resultado sera cierto (1) solo si los dos operandos son 1, y para los demas casos sera 0. en cuanto a la OR, solo sera falso (0) cuando los dos operandos son 0, y en cualquier otro caso sera 1.

te pondre un par de ejemplos mas:

si tienes un numero inicial 01100110 (102 en decimal), y quieres poner a 0 el bit 1 y 2 (en binario, el bit menos significativo es el de la derecha de todo y se considera el bit 0), entonces deberas aplicar una mascara AND con un numero que en esas posiciones tenga los bits en 0, y en todas las restantes tenga 1 para no alterar nada, ya que un AND con un 1 hara que el resultado siga como estaba, puesto que si estaba en 1 seria: 1&1=1 y si estaba en 0 seria: 1&0=0. por lo tanto, el numero que debemos usar para la mascara seria el 11111001, que es el 0xF9 en hexadecimal.
Código:
a=01100110
a&=0xF9 (a vale 01100000)

ahora imagina que quieres poner el bit 4 a 1, lo que deberias hacer es aplicar una mascara OR con un numero que tenga el bit en 1 en esa posicion, y las demas en 0 para no alterar nada mas, ya que si el bit estaba en 0: 0|0=0 y si estaba en 1: 1|0=1. este numero seria el 00010000, que es el 0x10 en hexadecimal.
Código:
a|=0x10 (a vale 01110000)

con esto y el operador shift (<< o >>) se pueden hacer infinidad de cosas a nivel de bits. la mas simple de todas, un simple programa que te pase de decimal a binario sin divisiones ni restos. (compila con un warning pero funciona bien, me daba pereza buscar el especificador de formato adecuado):

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4.  
  5. unsigned char byte;
  6. short int i;
  7.  
  8. printf("Ingresa un numero del 0-255: ");
  9. scanf("%u", &byte);
  10.  
  11. for (i=7; i>=0; i--)
  12. printf("%u", (byte>>i)&0x01);
  13. printf("\n");
  14.  
  15. return 0;
  16. }

con su salida:

Código:
:~$ ./dec2bin
Ingresa un numero del 0-255: 23
00010111

espero que te ayude, un saludo!
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Acceder a bits de un array.
« Respuesta #6 en: 24 Octubre 2012, 18:24 pm »

Umm... no se como no lo he pensado xD. Perdon por haberte hecho escribir tanto, y gracias por las respuestas. En cuanto a las mascaras, creia que te referias a los valores hexadecimales, ya conocia los operadores de bits.

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Copiar parte de una array a otra array
Programación Visual Basic
sircid 3 5,244 Último mensaje 19 Diciembre 2007, 11:27 am
por LeandroA
Acceder al evento de un miembro del array. ayuda
.NET (C#, VB.NET, ASP)
70N1 2 2,578 Último mensaje 24 Noviembre 2008, 17:00 pm
por 70N1
NOVATO... pasando de Vista 32 bits a Win 7 64 bits..... Alguien me ayuda? « 1 2 »
Windows
TCHITON 13 12,189 Último mensaje 20 Enero 2012, 23:27 pm
por d3xf4ult
tengo una notbook de 64 bits y necesito trabajar con un prog de 32 bits
Programación Visual Basic
twister69 2 3,319 Último mensaje 4 Septiembre 2012, 13:55 pm
por twister69
Acceder al parametro array de preg_match_all
PHP
franfis 4 2,394 Último mensaje 25 Marzo 2014, 08:38 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines