Bits manipulating question
-
Hi to all!
I've been writing some app that communicates with some device via modbus. Now, the communication works fine, but the device returns me data of type short and its structure is as follows:
bits 0-11: specific service code
bits 12-13: router status
bit 14: unused, always set to 0
bit 15: command response flagHow do get this bits in most elegant way, QBitArray conversion from short simply does not work! I've tried to use C++ bitfields but Ido not know how to query bits!
Sincerely,
MarkoEDIT: moved to C++ as it's a general C++ problem
-
Ok, but how do I get bits 0-11 from my scheme?
-
You create a mask that covers all those bits. If you want to make it easier to write the masks, perhaps "Boost::binary":http://www.boost.org/doc/libs/1_42_0/libs/utility/utility.htm#BOOST_BINARY can help you.
-
if you're stuck with bitsets, an easy way is :
- define a bunch of macro constants, defining value for each bit
#define BIT0 1
#define BIT1 2
#define BIT2 4
...
(note that bitX constant = 2 power x) - to create the mask, use binary "or" : mask = BIT0 | BIT3 | BIT 4
- to compare, use binary and (&) : check if (bitset & mask) != 0
E.g. : 17 = 2^4 + 2^0 => bit 0 and bit4 set, all other unset
check bit 0 :
(17 & BIT0) = (17 & 1) = 1 != 0 <<<< bit 0 is setcheck bit 3 :
(17 & BIT3) = (17 & 8) = 0 == 0 <<<< bit 3 not set - define a bunch of macro constants, defining value for each bit
-
To control bits, you can use:
- | (binary or ) => sets bit
- & with negative mask => unset bit
- not that negative mask can be done using ~ (binary inversion) : result = result & (~BIT4) <<< unsets bit 4