Solved

Setting the bits in an unsigned char.

Posted on 2007-12-02
20
199 Views
Last Modified: 2010-04-21
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;
}

Open in new window

0
Comment
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
  • Learn & ask questions
  • 8
  • 8
  • 3
20 Comments
 
LVL 53

Accepted Solution

by:
Infinity08 earned 250 total points
ID: 20392770
Something like this :


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

Open in new window

0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20392776
And a nice getBit :


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

Open in new window

0
 
LVL 3

Author Comment

by:Unimatrix_001
ID: 20392777
Actually, also how do I clear a bit?
0
Industry Leaders: 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!

 
LVL 53

Expert Comment

by:Infinity08
ID: 20392780
>> And a nice getBit :

With the code :

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

Expert Comment

by:Jaime Olivares
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;
}

Open in new window

0
 
LVL 55

Expert Comment

by:Jaime Olivares
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

by:Infinity08
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

by:Unimatrix_001
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

by:Infinity08
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

by:Unimatrix_001
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

by:Infinity08
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

by:Unimatrix_001
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

by:Infinity08
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

by:Infinity08
ID: 20392874
Do take a look at bitset in that case ...
0
 
LVL 3

Author Comment

by:Unimatrix_001
ID: 20392876
I shall... (-:
0
 
LVL 3

Author Comment

by:Unimatrix_001
ID: 20393064
Jamie, can you please post a comment...
0
 
LVL 55

Assisted Solution

by:Jaime Olivares
Jaime Olivares earned 250 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

by:Unimatrix_001
ID: 31412234
Yes, something just like that. :)
0
 
LVL 3

Author Comment

by:Unimatrix_001
ID: 20393090
Thank you. :)
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

717 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question