blog:2012:02:26:quelques_petits_trucs_en_c
Table des matières
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