C code for Bitwise Programming

This page contains C code for Von Neumann method using Bitwise C operator and a code to obtain a shared object for R. Also one code is given to save the output of C directly in a file. Then we are accessing the file directly from R to make plots etc. The codes are as follows:

C codes


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

/*Programmers: Gursharn, Smruti, Shwetab, Sagnika, Kaustav*/
/*Date: 18/08/2010 */

/*Bitwise Code for Von Neumann*/
unsigned long int bitv(unsigned long int x, int n);

int main(void)
{
  int n, m, i;
  unsigned long int temp, x;
  printf("Enter the number of digits in the binary number ");
  scanf("%d",&n);
  printf("Enter the number of random numbers to be generated ");
  scanf("%d",&m);

  srand(getpid());
  x =(int)((pow(2.0,n * 1.0) - 1) * (rand()/(double)RAND_MAX));
  for(i = 0; i < m; i++){
    printf("x = %lu",x);
    temp = bitv(x,n);
    printf("\t %lu\n",temp);
    x = temp;
  }
  return 0;
}


/*Bitwise Shift Operator*/

unsigned long int bitv(unsigned long int x, int n)
{
  unsigned long int y, z;
  
  y = x * x;
  z = y >> n/2;
  z = z << (sizeof(unsigned long int) * 8 - n);
  z = z >> (sizeof(unsigned long int) * 8 - n);
  return z;
}

C Code to obtain a shared object:


#include <R.h>
#include <Rdefines.h>
#include <Rinternals.h>
#include <stdlib.h>

/*Programmers: Gursharn, Smruti, Shwetab, Sagnika, Kaustav*/
/*Date: 18/08/2010 */

/*Bitwise Code for Von Neumann*/
unsigned int bitv(unsigned int x, int n);

SEXP vonbit(SEXP n, SEXP m, SEXP r)
{
  int i;
  unsigned int x;
  int N = INTEGER_POINTER(n)[0], M = INTEGER_POINTER(m)[0];
  double R = NUMERIC_POINTER(r)[0];

  SEXP ans; 
  ans = PROTECT(NEW_INTEGER(M));
  int *z = INTEGER_POINTER(ans);

  /*  unsigned long int temp, x;
  printf("Enter the number of digits in the binary number ");
  scanf("%d",&n);
  printf("Enter the number of random numbers to be generated ");
  scanf("%d",&m);*/

  srand((int)(R * pow(10.0,4.0)));

  x =(int)((pow(2.0, N * 1.0) - 1) * (rand()/(double)RAND_MAX));
  for(i = 0; i < M; i++){
    z[i] = bitv(x,N);
    x = z[i];
  }
  UNPROTECT(1);
  return ans;
}


/*Bitwise Shift Operator*/

unsigned int bitv(unsigned int x, int n)
{
  unsigned int y, z;
  
  y = x * x;
  z = y >> n/2;
  z = z << (sizeof(unsigned int) * 8 - n);
  z = z >> (sizeof(unsigned int) * 8 - n);
  return z;
}

C Code to store the random numbers in a file:

Here the data is stored in a file named data.


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

/*Programmers: Gursharn, Smruti, Shwetab, Sagnika, Kaustav*/
/*Date: 18/08/2010 */

/*Bitwise Code for Von Neumann*/
unsigned long int bitv(unsigned long int x, int n);

int main(void)
{
  int n, m, i;
  FILE *fp;
  unsigned long int temp, x;
  printf("Enter the number of digits in the binary number ");
  scanf("%d",&n);
  printf("Enter the number of random numbers to be generated ");
  scanf("%d",&m);
  fp = fopen("data","w");
  srand(getpid());
  x =(int)((pow(2.0,n * 1.0) - 1) * (rand()/(double)RAND_MAX));
  for(i = 0; i < m; i++){
    temp = bitv(x,n);
    fprintf(fp,"%lu",temp);
    x = temp;
  }
  fclose(fp);
  return 0;
}


/*Bitwise Shift Operator*/

unsigned long int bitv(unsigned long int x, int n)
{
  unsigned long int y, z;
  
  y = x * x;
  z = y >> n/2;
  z = z << (sizeof(unsigned long int) * 8 - n);
  z = z >> (sizeof(unsigned long int) * 8 - n);
  return z;
}