Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 460
  • Last Modified:

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.
0
cytello
Asked:
cytello
1 Solution
 
cytelloAuthor 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
 
jkrCommented:
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;

Open in new window

0
 
lomo74Commented:
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);

Open in new window

0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
frankhelkCommented:
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;
}

Open in new window

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

Open in new window

0
 
lomo74Commented:
0
 
sarabandeCommented:
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
 
cytelloAuthor Commented:
Thank you.
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now