The code below will get two integers X
and Y
from user, convert them to binary and insert all bits of Y
after the last set bit in X
.
example: 10 14
output: 188
Explanation:
10 -> 1010
14 -> 1110
10111100 -> 188
Here is the code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int insertBits(int X, int Y) {
int int_to_bin(int k) {
return (k == 0 || k == 1 ? k : ((k % 2) 10 * int_to_bin(k / 2)));
}
int a1 = int_to_bin(X);
int a2 = int_to_bin(Y);
char msg[20];
char msg1[20];
char deal[20];
sprintf(msg, "%d", a1);
sprintf(msg1, "%d", a2);
int k = 0;
int i = 0;
for (i = strlen(msg) - 1; i >= 0; i--) {
if (msg[i] == '1') {
k = 1;
break;
}
}
memcpy(msg, &msg[0], i);
memcpy(deal, &msg[i], -1);
strcat(msg, deal);
printf("%s", strcat(deal, msg1));
}
int main() {
insertBits(10, 20);
}
I wrote the code till converting the input to binary and extracted the binarys i dont know how to merge it and convert to decimal.please help me
CodePudding user response:
Ok so lets summarize what you have to do,
- Convert the numbers in 4bit binary and concatenate into a string.
- After both numbers are done in separate strings concatenate both strings to get new string.
- Convert the new string in decimal.
This functions converts a single number into 4bit binary string. Call this 2 times and you get two string with 4bit bin number. Now take the two string and concatenate it for getting the final string.
const char *byte_to_binary(int x)
{
static char b[9];
b[0] = '\0';
int z;
for (z = 8; z > 0; z >>= 1)
{
strcat(b, ((x & z) == z) ? "1" : "0");
}
return b;
}
Now what if you need more the 4bits. You can see I have initialized z=8
because 0b0000 1000 in dec is 8. so if you need 5bit then just so z=16
because 0b0001 0000 is 16 in dec.
For converting string of numbers in decimal, use the basic concept. If bin number is 0b1000, then to convert it to dec you need to do, 12^3 02^2 02^1 02^0.
for(sum=0, j=0, s=strlen(num)-1; s >= 0; s--, j){
if(num[s] == '1'){
sum = sum pow(2,j);
}
}
This code snippet converts a string of binary in dec. That's it.
P.S. Not giving you full code as time is limited and I guess you are smart enough to figure it out by yourself. Comment for any help.
CodePudding user response:
I will give a non portable answer. It will work for x86 gcc.
#include <stdio.h>
int insertBits(int X, int Y) {
int msb;
asm("bsrl %1,%0" : "=r"(msb) : "r"(X));
Y <<= (msb 1);
return X|Y;
}
int main() {
printf("%d\n", insertBits(10, 20));
}
X=10 => 1010
Y=20 => 10100
Result=330 => 101001010
CodePudding user response:
Your approach is severely limited: if the number is larger than 1023, the conversion will overflow the range of int
.
You should use unsigned int
arguments, compute the number of trailing zeroes in X
and the number of bits in Y
and the result will be easy to get with shift operations:
unsigned int insertBits(unsigned int X, unsigned int Y) {
int n1, n2;
unsigned int temp;
if (X == 0)
return Y;
if (Y == 0)
return X;
// compute the number of trailing zeroes in X
for (n1 = 0, temp = X; (temp & 1) == 0; n1 , temp >>= 1)
continue;
// compute the number of bits in Y
for (n2 = 0, temp = Y; temp != 0; n2 , temp >>= 1)
continue;
return ((X >> n1 << n2) | Y) << n1;
}