# C++ binary and decimal conversion

I am looking for a good way for the following conversion in C++:

41283 is binary digit “1010000101000011”
From first bit,
Structure ID:101¿5 (decimal)
Item No.:0000101¿5 (decimal)
Route No:000011¿3 (decimal)

Thank you.
Asked:
###### Who is Participating?

Commented:
And here the elegant (bitfields) way to let the compiler sort the stuff out:
``````#include <stdio.h>

typedef union
{
short value;
struct
{   // stacked backwards !
unsigned int RouteNo:6;
unsigned int itemNo:7;
unsigned int structId:3;
} fields;
} bitfield;

int main()
{
bitfield val;

val.value = 41283;

printf("StructID : %d\n", val.fields.structId);
printf("ItemNo   : %d\n", val.fields.itemNo);
printf("RouteNo  : %d\n", val.fields.RouteNo);

return 0;
}
``````
Easier to understand, and more simple to use thruout the code. And more easy to handle if the coding of the bitfield changes.

Output would be
``````StructID : 5
ItemNo   : 5
RouteNo  : 3
``````
0

Author Commented:
Sorry about the strange characters

1. I need to convert 41283 to binary as 1010000101000011
2. convert the first 3 bits 101 to decimal
3. convert the next 7 bits 0000101 to decimal
4. convert the next 6 bits 000011 to decimal

Is there a way to get the decimal values for the 3 bits, 7 bits, and 6 bits?
0

Commented:
If you only want to read that data (and not write it), a simple bit shifting/masking approach will do - otherwise I'd point you to 'bitsets' (http://www.cplusplus.com/reference/bitset/bitset/) or 'bitfields' (http://en.wikipedia.org/wiki/Bit_field). But, in your case, that can be done like

``````short int val = 41283; // 16 bits

short int structID = (val & 0x1c00) >> 13;
short int itemNo = (val & 0x01fc0) >> 6;
short int routeNo = val & 0x003f;
``````
0

Commented:
the opposite procedure would be:
``````unsigned short int val1, val2, val3, num;
val1 = 5;
val2 = 5;
val3 = 3;
num = (val1 & 0x07) << 13 |
(val2 & 0x7F) << 6 |
(val3 & 0x3F);
``````
0

Commented:
0

Commented:
cytello, is it homework?

if yes, you may post the complete assignment such that we could help you to writing your own code.

generally, converting a string number from one base to another (in your sample it is from base 2 to base 10), you easily could do it by extracting each digit from right to left, convert the digit to number, multiply it with the base^n  (where n is a loop counter beginning at 0) and add the result to the total.

for '110' you would get 0*2^0 + 1*2^1 + 1*2^2 = 0 + 2 + 4 = 6.

Sara
0

Author Commented:
Thank you.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

## Already a member? Login.

All Courses

From novice to tech pro — start learning today.