27.8k views
14 votes
Write a C program that reads two hexadecimal values from the keyboard and then stores the two values into two variables of type unsigned char. Read two int values p and k from the keyboard, where the values are less than 8. Replace the n bits of the first variable starting at position p with the last n bits of the second variable. The rest of the bits of the first variable remain unchanged. Display the resulting value of the first variable using printf %x.Test Cases:n = 3;p=4;input: a= 0x1f (0001 1111) b = c3 (1100 0011); output: f (0000 1111)n = 2;p=5;input: a= 0x1f (0001 1111) b = c3 (1100 0011); output: 3f (0011 1111)

1 Answer

6 votes

Solution :

#include
$<\text{stdio.h}>$

#include
$<\text{string.h}>$

#include
$<\text{stdlib.h}>$

//Converts
$\text{hex string}$ to binary string.


$\text{char}$ * hexadecimal
$\text{To}$Binary(char* hexdec)

{

long
$\text{int i}$ = 0;

char *string =
$(\text{char}^ *) \ \text{malloc}$(sizeof(char) * 9);

while (hexdec[i]) {

//Simply assign binary string for each hex char.

switch (hexdec[i]) {


$\text{case '0'}:$

strcat(string, "0000");

break;


$\text{case '1'}:$

strcat(string, "0001");

break;


$\text{case '2'}:$

strcat(string, "0010");

break;


$\text{case '3'}:$

strcat(string, "0011");

break;


$\text{case '4'}:$

strcat(string, "0100");

break;


$\text{case '5'}:$

strcat(string, "0101");

break;


$\text{case '6'}:$

strcat(string, "0110");

break;


$\text{case '7'}:$

strcat(string, "0111");

break;


$\text{case '8'}:$

strcat(string, "1000");

break;


$\text{case '9'}:$

strcat(string, "1001");

break;

case 'A':

case 'a':

strcat(string, "1010");

break;

case 'B':

case 'b':

strcat(string, "1011");

break;

case 'C':

case 'c':

strcat(string, "1100");

break;

case 'D':

case 'd':

strcat(string, "1101");

break;

case 'E':

case 'e':

strcat(string, "1110");

break;

case 'F':

case 'f':

strcat(string, "1111");

break;

default:

printf("\\Invalid hexadecimal digit %c",

hexdec[i]);

string="-1" ;

}

i++;

}

return string;

}

int main()

{ //Take 2 strings

char *str1 =hexadecimalToBinary("FA") ;

char *str2 =hexadecimalToBinary("12") ;

//Input 2 numbers p and n.

int p,n;

scanf("%d",&p);

scanf("%d",&n);

//keep j as length of str2

int j=strlen(str2),i;

//Now replace n digits after p of str1

for(i=0;i<n;i++){

str1[p+i]=str2[j-1-i];

}

//Now, i have used c library strtol

long ans = strtol(str1, NULL, 2);

//print result.

printf("%lx",ans);

return 0;

}

User Loretta
by
4.5k points