Jak ustawić / wyłączyć bit w określonej pozycji długiej?

Jak ustawić / wyłączyć bit w określonej pozycji długiego w Javie ?

Na przykład,

long l = 0b001100L ; // bit representation

Chcę ustawić bit na pozycji 2 i unset bit na pozycji 3, więc odpowiadający mu long będzie,

long l = 0b001010L ; // bit representation
Czy ktoś może mi pomóc Jak to zrobić ?
Author: RealSkeptic, 2012-08-18

5 answers

Aby ustawić bit, użyj:

x |= 0b1; // set LSB bit
x |= 0b10; // set 2nd bit from LSB

Aby wymazać bit użyj:

x &= ~0b1; // unset LSB bit (if set)
x &= ~0b10; // unset 2nd bit from LSB

Aby przełączyć bit użyj:

x ^= 0b1;

Zauważ, że używam 0b?. Można również użyć dowolnej liczby całkowitej, np:

x |= 4; // sets 3rd bit
x |= 0x4; // sets 3rd bit
x |= 0x10; // sets 9th bit
[[9]}jednak trudniej jest wiedzieć, który bit jest zmieniany.

Użycie binary pozwala sprawdzić, które dokładne bity zostaną ustawione/wymazane / przełączone.

Aby dynamicznie ustawić bit, użyj:

x |= (1 << y); // set the yth bit from the LSB

(1 << y) przesuwa ...001 y miejsca w lewo, więc można przesunąć zestaw bit y miejsca.

Można również ustawić wiele bitów naraz:

x |= (1 << y) | (1 << z); // set the yth and zth bit from the LSB

Lub odłączyć:

x &= ~((1 << y) | (1 << z)); // unset yth and zth bit

Lub przełączyć:

x ^= (1 << y) | (1 << z); // toggle yth and zth bit
 59
Author: ronalchn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 21:16:54

Najmniej znaczący bit (lsb) jest zwykle określany jako bit 0, więc twoja 'pozycja 2' jest tak naprawdę 'bit 1'.

long x = 0b001100;  // x now = 0b001100
x |= (1<<1);        // x now = 0b001110 (bit 1 set)
x &= ~(1<<2);       // x now = 0b001010 (bit 2 cleared)
 7
Author: push2eject,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-18 03:45:21

Wybrałbym BigInteger do tego...

class Test {
    public static void main(String[] args) throws Exception {
        Long value = 12L;
        BigInteger b = new BigInteger(String.valueOf(value));
        System.out.println(b.toString(2) + " " + value);
        b = b.setBit(1);
        b = b.clearBit(2);
        value = Long.valueOf(b.toString());
        System.out.println(b.toString(2) + " " + value);
    }
}

A oto wyjście:

1100 12
1010 10
 3
Author: SiB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-18 04:09:36
  • Konwertuj long na bitset
  • Ustaw bit, którego potrzebujesz
  • Konwertuj bitset z powrotem na long

Zobacz ten post BitSet to and from integer / long dla metod konwersji long na bitset i vice versa

 -1
Author: Kan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:14

Zobacz klasę java.util.BitSet, który zrobi to za Ciebie.

Aby ustawić: myByte.set(bit); Aby zresetować : myByte.clear(bit); Do wypełnienia bool: myByte.set(bit, b); Aby uzyskać bool: b = myByte.get(bit);

 -1
Author: sebyku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-22 08:50:41