ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2012:02:26:quelques_petits_trucs_en_c

Quelques petits trucs en C

~~READMORE~~

Plusieurs Bits fixés dans un entier

Y a t'il plusieurs bits fixés dans l'entier ?

#include <stdio.h>

static inline int multiple_bits_set( int x )
{
  return( ( x & ( x - 1 ) ) != 0 );
}

int main( void )
{
  int tab[] = {
    1,  // 000001
    2,  // 000010
    3,  // 000011
    4,  // 000100
    5,  // 000101
    6,  // 000110
    7,  // 000111
    8,  // 001000
  };

  for( int i=0; i<(sizeof(tab)/sizeof(tab[0])); i++ ) {
    printf("Plusieurs bits dans %d : %s\n",
      tab[i],
      multiple_bits_set( tab[i] )?"Oui":"Non"
      );
  }
  return( 0 );
}
gcc -std=gnu99 -Wall -o test test.c
./test
Plusieurs bits dans 1 : Non
Plusieurs bits dans 2 : Non
Plusieurs bits dans 3 : Oui
Plusieurs bits dans 4 : Non
Plusieurs bits dans 5 : Oui
Plusieurs bits dans 6 : Oui
Plusieurs bits dans 7 : Oui
Plusieurs bits dans 8 : Non

Source: dd.c

Aligner un pointeur sur une page (segment)

#include <stdio.h>
#include <stdlib.h>

static inline void * ptr_align( void const *ptr, size_t alignment )
{
  char const *p1 = ptr + alignment - 1;
  return (void *) ( p1 - ( ( (size_t) p1 ) % alignment ) );
}

int main( void )
{
  size_t page_size = 4096;    // see "getpagesize()" in unistd.h
  void *pages_mem = malloc( ( page_size * 2 ) -1 );   // never NULL ?
  enum { TAB_NB=3 };
  void *tab[ TAB_NB ] = {
    pages_mem,
    (void *)( (size_t)pages_mem+(page_size/2) ),
    (void *)( (size_t)pages_mem+(page_size-1) )
    };

  printf("page_size = %d\n",page_size);

  for( int i=0; i<TAB_NB; i++ ) {
  void *ptr = tab[i];
  void *ptr_aligned = ptr_align( ptr, page_size );

  printf("ptr %p aligned ? %s\n",
    ptr,
   ( (size_t)ptr % page_size ) == 0 ? "Oui" : "Non"
   );

  printf("and now? ptr %p aligned ? %s\n",
    ptr_aligned,
    ( (size_t)ptr_aligned % page_size ) == 0 ? "Oui" : "Non"
    );
  }

  return 0;
}
gcc -std=gnu99 -Wall -o test test.c
./test
page_size = 4096
ptr 0x9d7f008 aligned ? Non
and now? ptr 0x9d80000 aligned ? Oui
ptr 0x9d7f808 aligned ? Non
and now? ptr 0x9d80000 aligned ? Oui
ptr 0x9d80007 aligned ? Non
and now? ptr 0x9d81000 aligned ? Oui

Source : dd.c

blog/2012/02/26/quelques_petits_trucs_en_c.txt · Dernière modification : 2012/02/26 22:28 de thierry