DaidalosCheung / C

0 stars 0 forks source link

Bitwise operation #7

Open DaidalosCheung opened 3 years ago

DaidalosCheung commented 3 years ago

kwok_sort5.c

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

/* Syntaxlly, int* res[] is equivalent to int** res. */
/* int* res[] means pointer to pointer, in this case, each number will
   be assigned to res[i], total for `res_size` numbers. */
void sorted_cards( unsigned int r1,
           unsigned int r2,
           unsigned int r3,
           unsigned int r4,
           unsigned int r5,
           unsigned int* res[], size_t* res_size ) {

  unsigned int mask = r1 | r2 | r3 | r4 | r5;

  size_t size = 5;
  /* `int* sorted` indicate a 1-D address, no matter with `*size` in malloc */
  /* unsigned int* sorted = malloc( sizeof( unsigned int ) * size ); */
  /* for ( unsigned int* ptr = sorted; ptr < sorted + size; ptr++ ) *ptr = 0; */

  /* int si = 0; */
  /* for ( int i = 0; i <= 13; i++ ) { */
  /*   unsigned int extracted = mask & ( 1 << i ); */
  /*   if ( extracted ) { */
  /*     sorted[ si++ ] = extracted; */
  /*   } */
  /* } */

  /* *res = sorted; // 2-D unit * element still uses 1-D pointer? */
  /* *res_size = size; */

  *res = malloc( sizeof( unsigned int ) * size );
  for ( unsigned int* ptr = *res; ptr < *res + size; ptr++ ) *ptr = 0;

  int si = 0;
  for ( int i = 0; i <= 13; i++ ) {
    unsigned int extracted = mask & ( 1 << i );
    if ( extracted ) {
      ( *res )[ si++ ] = extracted;
      /* *( *res + si++ ) = extracted; */
    }
  }

  *res_size = size;
}

int main( void ) {

  unsigned int r1 = 2048, r2 = 1024, r3 = 8192, r4 = 4, r5 = 4096;

  unsigned int* sorted = NULL;
  size_t sorted_size = 0;

  // Since `sorted` was decleared as a pointer (int* sorted), the
  // function `sorted_cards` should be passed along with a pointer to
  // pointer:

  sorted_cards( r1, r2, r3, r4, r5, &sorted, &sorted_size );

  for ( int i = 0; i < sorted_size; i++ ) {
    printf( "[%d] %d\n", i, sorted[ i ] );
  }

  free( sorted );
  sorted = NULL;

  /* unsigned int* test = malloc( sizeof( unsigned int ) * 19 ); */
  /* unsigned int another_test[ 19 ]; */
  /* printf( "%lu\n", sizeof( another_test ) ); */

  return 0;
}

/* Notes:
unsigned int: normal int take 32 bits, but the first bit
indicate its sign "+ or -", which makes it can store only 31 bits int;
but unsigned int takes whole 32 bits with no sign.
*/
DaidalosCheung commented 3 years ago

ray_sort5.c

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

void sorted_cards( unsigned int result, unsigned int* num[], unsigned int* num_size) {
  int j = 0;

  size_t size = 5;
  unsigned int* sorted = malloc( sizeof( unsigned int ) * size );
  for ( unsigned int* ptr = sorted; ptr < sorted + size; ptr++ ) *ptr = 0;

  for ( int i = 0; i <= 13; i++ ) {
    unsigned int extracted = result & (1<<i);
    if ( extracted != 0 ) {
      num[j++] = extracted; // [1]
    }
  }

  *num = sorted;
  *num_size = size;
}

int main(void) {

  unsigned int r1 = 2048, r2 = 8, r3 = 1024, r4 = 2, r5 = 8192;

  unsigned int* sorted = NULL;
  unsigned int sorted_size = 0;

  sorted_cards( r1 | r2 | r3 | r4 | r5, &sorted, &sorted_size );

  for(int i = 5; i > 0 ; i--) { // [2]
    printf( "[%d] = %d\n", i, sorted[i] );
  }

  free( sorted );
  sorted = NULL;

  return 0;
}
DaidalosCheung commented 3 years ago

Binary convertor

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

void dec_to_bi (int num, unsigned int * bi_form); // convert a certain int "num" into binary, and store it int the list "biform"
void show_bi (unsigned int * bi_from);                  // print the result of binary in list form;

int main (int argc, char * argv[]) {
  int num;
  unsigned int bi_form [32];

  puts("Input an integer and I will convert it into binary: ");
  scanf("%d", &num);

  dec_to_bi (num, bi_form);
  show_bi (bi_form);

  return 0;
}

void dec_to_bi (int num, unsigned int * bi_form) {
  int mask = 0x1;

  for (int i = 31; i >= 0; i--, mask <<= 1 ) { 
    if ( (num & mask) != 0) {
      printf("%d + ", num & mask);                 // print the "num" in the sum of 2 powers;
      bi_form[i] = 1;                                        // implement the list, with certain position of 1;
    }
    else bi_form[i] = 0; 
  }
}

void show_bi (unsigned int * bi_form) {
  printf("\n[");

  for (int i = 0; i < 32; i++) {
    printf("%d", bi_form [i]);
    if ( (31 - i) % 4 == 0 ) 
      putchar(' ');
  } 

  printf("]\n");
}