Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
Solved

# Setting the bits in an unsigned char.

Posted on 2007-12-02
Medium Priority
204 Views
Hi,

I use the attached method to get the bits out of a byte, but what is the equivalent of setting the bits in a byte?

Thanks,
Uni
``````BIT* convertByteToBits(BYTE aByte){
BIT *aBits=new BIT[8];
for(unsigned int bitCount=0;bitCount<8;bitCount++)
aBits[bitCount]=((aByte>>bitCount)&1);
return aBits;
}
``````
0
Question by:Unimatrix_001
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 8
• 8
• 3

LVL 53

Accepted Solution

Infinity08 earned 1000 total points
ID: 20392770
Something like this :

``````void setBit(BYTE &aByte, int pos) {
aByte |= 0x01 << pos;
}
``````
0

LVL 53

Expert Comment

ID: 20392776
And a nice getBit :

``````bool getBit(BYTE aByte, int pos) {
return (aByte & (0x01 << pos));
}
``````
0

LVL 3

Author Comment

ID: 20392777
Actually, also how do I clear a bit?
0

LVL 53

Expert Comment

ID: 20392780
>> And a nice getBit :

With the code :

bool getBit(BYTE aByte, int pos) {
return (aByte & (0x01 << pos));
}
0

LVL 55

Expert Comment

ID: 20392783
I should be something like:

``````BYTE convertBitsToBytes(BIT *bits)
{
BYTE result = 0;
for (int bitCount=7;bitCount>=0;bitCount--)
result = (result<<1) | bits[i];
return result;
}
``````
0

LVL 55

Expert Comment

ID: 20392790
BYTE convertBitsToByte(BIT *bits)
{
result = 0;
for(int bitCount=7;bitCount>=0;bitCount--)
result = (result<<1) | bits[i];
return result;
}
0

LVL 53

Expert Comment

ID: 20392794
>> Actually, also how do I clear a bit?

void clearBit(BYTE &aByte, int pos) {
aByte &= (0xFF ^ (0x01 << pos));
}
0

LVL 3

Author Comment

ID: 20392796
Okay, cheers for that Jamie... Sorry Infinity, I'm going to get the question reopened to split the points 50/50 with you and Jamie... My bad though, I shouldn't have worded the question as setting the bits...
0

LVL 53

Expert Comment

ID: 20392816
>> My bad though, I shouldn't have worded the question as setting the bits...

It's quite inefficient to do it that way though - that's why I posted code to set and get single bits. For most applications, there's no need to convert a byte to an array of bits - you can simply loop over the bits in the byte directly.

You can also consider the std::bitset :

http://www.cplusplus.com/reference/stl/bitset/

but it's not much better.
0

LVL 3

Author Comment

ID: 20392823
>>For most applications, there's no need to convert a byte to an array of bits - you can simply loop over the bits in the byte directly.

I fully plan to do that, although that makes the works slightly harder, so I'll leave that for a future time. ;)
0

LVL 53

Expert Comment

ID: 20392850
>> I fully plan to do that, although that makes the works slightly harder, so I'll leave that for a future time. ;)

It doesn't make it harder. Instead of this :

BIT *bits = convertByteToBits(aByte);
for (int i = 0; i < 8; ++i) {
std::cout << bits[i];
}
delete [] bits;

you'd simply have :

for (int i = 0; i < 8; ++i) {
std::cout << getBit(aByte, i);
}

I don't see how that's harder ... You can even bypass the function call if you feel like it :

for (int i = 0; i < 8; ++i) {
std::cout << ((aByte >> i) & 0x01);
}
0

LVL 3

Author Comment

ID: 20392867
Well you see I dot about the file for certain bits, so at the moment it's easier for me to just read all the file in as bits...
0

LVL 53

Expert Comment

ID: 20392873
>> Well you see I dot about the file for certain bits, so at the moment it's easier for me to just read all the file in as bits...

I disagree, but it's your code ;)
0

LVL 53

Expert Comment

ID: 20392874
Do take a look at bitset in that case ...
0

LVL 3

Author Comment

ID: 20392876
I shall... (-:
0

LVL 3

Author Comment

ID: 20393064
0

LVL 55

Assisted Solution

Jaime Olivares earned 1000 total points
ID: 20393080
My solution:
BYTE convertBitsToByte(BIT *bits)
{
result = 0;
for(int bitCount=7;bitCount>=0;bitCount--)
result = (result<<1) | bits[i];
return result;
}

Greetings,
Jaime.
0

LVL 3

Author Closing Comment

ID: 31412234
Yes, something just like that. :)
0

LVL 3

Author Comment

ID: 20393090
Thank you. :)
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, whâ€¦
Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on thâ€¦
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.
###### Suggested Courses
Course of the Month11 days, 21 hours left to enroll