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ć ? 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
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)
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
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
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);
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