dinorider
dinorider

Reputation: 191

Loop and return all bitwise values in Long

To set bits, you use the OR operator. You can then use the AND operator to see which bits have been set:

long values = 0;

// Set bits
values |= (1L << 10);
values |= (1L << 45);
values |= (1L << 5600);

// Check if values are set
System.out.println(hasValue(values, 45));   // Returns true
System.out.println(hasValue(values, 55));   // Returns false
System.out.println(hasValue(values, 5600)); // Returns true

public static boolean hasValue(long data, int value)
{
    return (((data >> value) & 1L) > 0);
}

Is it possible to loop through values and return each of the values originally set with the OR operator? The result printing:

Found value: 10
Found value: 45
Found value: 5600

Edit: Altered example to include larger numbers.

Upvotes: 0

Views: 240

Answers (3)

SgtOmer
SgtOmer

Reputation: 215

You could use your function inside of a loop from 0 to 64 to find everything like so:

for (int i = 0; i < 64; i++) {
    if (hasValue(values, i))
        System.out.println(“Found value: “ + i);
}

But I think there’s a better way. It’s destructive to the variable so if you want to save it for later do it before the loop but here it is:

for (int i = 0; i < 64 && values != 0; i++) {
    if (values % 2 == 1)
        System.out.println(“Found value: “ + i);
    values = values >> 1;
}

The big advantage is to shift one bit at a time and not i bits every time needed.

Upvotes: 2

iggi
iggi

Reputation: 330

I hope I understand question correctly. You just need to shift values by 1, and check youngest bit by AND 1 like that:

class Main {  
    public static void main(String args[]) { 
        long v = 0;
        v |= (1L << 10);
        v |= (1L << 45);
        v |= (1L << 56);
        int i = 0;
        while(v != 0) {
            if((v & 1L) == 1) {
                 System.out.println("Found value: " + i);
            }
            v = v >>> 1;
            i++;
        }
    } 
}

Upvotes: 1

Ravindra HV
Ravindra HV

Reputation: 2608

Java long has 64 bits.

So you could use 8 bits and store a maximum of 8 integers whose value is between 0 and 255 (unsigned).

You will need to use shift and then store.

So first unsigned byte will be 0-7 bits, second would be 8-15, third being 16-23 and so on.

But not otherwise.

Upvotes: 0

Related Questions