C
Curious Student
I'd be obliged if someone could validate the functions I've written
below from the try-it-yourself excercises of K&R:
below from the try-it-yourself excercises of K&R:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void DWordToWords(const int DWord, short int* LoWord, short int*
HiWord);
void MakeDWord(const short LoWord, const short HiWord, int* DWord);
unsigned GetBits(unsigned, int, int);
unsigned SetBits(unsigned, int, int, int);
unsigned Invert(unsigned, int, int);
/*int main(void)
{
int DWord;
short LoWord, HiWord;
DWord = 1066825727;
LoWord = HiWord = 0;
DWordToWords(DWord, &LoWord, &HiWord);
printf("DWord = %d\nLoWord = %d\nHiWord = %d\n\n", DWord, LoWord,
HiWord);
DWord = 0;
MakeDWord(LoWord, HiWord, &DWord);
printf("DWord = %d\nLoWord = %d\nHiWord = %d\n\n", DWord, LoWord,
HiWord);
}*/
void DWordToWords(const int DWord, short int* LoWord, short int*
HiWord)
{
*LoWord = DWord & ~(~0<<16);
*HiWord = DWord>>16;
}
void MakeDWord(const short LoWord, const short HiWord, int* DWord)
{
*DWord = HiWord<<16;
*DWord |= LoWord;
}
unsigned int GetBits(unsigned x, int p, int n)
{
/*gets the right-adjusted n bits of integer x
starting from position p*/
return (x>>(p-n+1)) & ~(~0<<(p-n));
}
unsigned int SetBits(unsigned x, int p, int n, int y)
{
/*set n bits of integer x starting from position
p to the right-most n bits in integer y*/
y&=~(~0<<n);
return x|((y&~(~0<<n))<<(p-n+1));
}
unsigned Invert(unsigned x, int p, int n)
{
/*Inverts n bits in x starting from position p*/
int temp=GetBits(x, p, n);
temp=~temp;
return SetBits(x, p, n, temp);
}