Jak działają operatorzy zmian w Javie? [duplikat]
To pytanie ma już odpowiedź tutaj:
[2]} staram się zrozumieć operatorów zmiany i nie mogę uzyskać wiele. Kiedy próbowałem wykonać poniższy kodSystem.out.println(Integer.toBinaryString(2 << 11));
System.out.println(Integer.toBinaryString(2 << 22));
System.out.println(Integer.toBinaryString(2 << 33));
System.out.println(Integer.toBinaryString(2 << 44));
System.out.println(Integer.toBinaryString(2 << 55));
I get the below
1000000000000
100000000000000000000000
100
10000000000000
1000000000000000000000000
Czy ktoś mógłby to wyjaśnić? 9 answers
System.out.println(Integer.toBinaryString(2 << 11));
Przesuwa binarny 2 (10
) o 11 razy w lewo. Stąd: 1000000000000
System.out.println(Integer.toBinaryString(2 << 22));
Przesuwa binarny 2 (10
) o 22 razy w lewo. Stąd: 100000000000000000000000
System.out.println(Integer.toBinaryString(2 << 33));
Int ma 4 bajty, stąd 32 bity. Więc kiedy przesuniesz o 33, jest to równoważne przesunięciu o 1. Stąd: 100
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-06-06 08:48:30
2 z systemu numeracji dziesiętnej w układzie binarnym jest następujący
10
Now if you do
2 << 11
Byłoby, 11 zer byłoby wyściełane po prawej stronie
1000000000000
Podpisany operator lewej zmiany " > " przesuwa wzór bitowy w prawo. Wzór bitowy jest podawany przez operand lewostronny, a liczba pozycji do przesunięcia przez operand prawostronny. Unsigned right shift operator "> > > "przesuwa zero do pozycji w lewo, podczas gdy pozycja w lewo po "> > " zależy od rozszerzenia znaku [..]
Przesunięcie w lewo powoduje mnożenie przez 2 (*2) w kategoriach lub arytmetyce
Na przykład
2 w binarnym 10
, jeśli zrobisz <<1
to będzie 100
czyli 4
4 w binarnym 100
, jeśli zrobisz <<1
to będzie 1000
czyli 8
Również Zobacz
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-10-24 14:11:18
Prawa i lewa zmiana działają w ten sam sposób oto jak działa prawa Zmiana; The Right Shift: Prawy operator zmiany,>>, przesuwa wszystkie bity wartości w prawo określoną liczbę razy. Jego ogólna forma:
value >> num
Tutaj num określa liczbę pozycji do przesunięcia w prawo wartości w wartość. Oznacza to, że > > przesuwa wszystkie bity w podanej wartości w prawo o liczbę pozycji bitowych określoną przez num. Poniższy fragment kodu przesuwa wartość 32 W Prawo o dwie pozycje, co skutkuje ustawieniem na 8:
int a = 32;
a = a >> 2; // a now contains 8
Gdy wartość ma bity, które są "przesunięte", te bity są tracone. Na przykład, następny fragment kodu przesuwa wartość 35 na dwie właściwe pozycje, co powoduje utratę dwóch bitów niskiego rzędu, co ponownie powoduje ustawienie na 8.
int a = 35;
a = a >> 2; // a still contains 8
Patrząc na tę samą operację w binarnym pokazuje wyraźniej, jak to się dzieje:
00100011 35 >> 2
00001000 8
Za każdym razem, gdy przesuniesz wartość w prawo, dzieli ją przez dwa-i odrzuca wszelkie resztki. Możesz to wykorzystać do wysokowydajnego dzielenia liczb całkowitych przez 2. Oczywiście musisz mieć pewność, że nie przesuwasz żadnych kawałków na właściwy koniec.
Podczas przesuwania w prawo, górne (lewe) bity odsłonięte przez przesunięcie w prawo są wypełnione poprzednią zawartością górnego bitu. Nazywa się to rozszerzeniem znaku i służy do zachowania znaku liczb ujemnych po przesunięciu ich w prawo. Na przykład, –8 >> 1
jest –4
, który w binarnym jest
11111000 –8 >>1
11111100 –4
It warto zauważyć, że jeśli przesuniesz -1 w prawo, wynik zawsze pozostanie -1, ponieważ rozszerzenie znaku ciągle wprowadza więcej tych w bitach wysokiego rzędu. Czasami nie jest pożądane podpisywanie wartości rozszerzających, gdy przesuwasz je w prawo. Na przykład poniższy program konwertuje wartość bajtu na jej szesnastkową reprezentację łańcuchową. Zauważ, że przesunięta wartość jest maskowana przez dodanie 0x0f, aby odrzucić dowolne bity rozszerzone znakiem, aby wartość mogła być użyta jako indeks do tablica znaków szesnastkowych.
// Masking sign extension.
class HexByte {
static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
byte b = (byte) 0xf1;
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}
Oto wyjście tego programu:
b = 0xf1
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
2013-04-10 23:20:31
Wierzę, że to może pomóc:
System.out.println(Integer.toBinaryString(2 << 0));
System.out.println(Integer.toBinaryString(2 << 1));
System.out.println(Integer.toBinaryString(2 << 2));
System.out.println(Integer.toBinaryString(2 << 3));
System.out.println(Integer.toBinaryString(2 << 4));
System.out.println(Integer.toBinaryString(2 << 5));
Wynik
10
100
1000
10000
100000
1000000
Edycja:
Należy przeczytać to (jak-zrobić-bitowe-operatory-shift-work)
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-09 07:23:07
Myślę, że będzie to na przykład:
- Signed left shift
[ 2 [10 (binarny z 2) Dodać 1 zero na końcu ciągu binarnego] stąd 10 będzie 100, które staje się 4.
Signed left shift używa mnożenia... Tak więc można to również obliczyć jako 2 * (2^1) = 4. Inny przykład [2 2 *(2^11) = 4096
- Signed right shift
[ 4 >> 1 ] is = >[100 (binary of 4) Usuń 1 zero na końcu ciągu binarnego] stąd 100 będzie 10, które staje się 2.
Signed right shift uses division... Więc można to również obliczyć jako 4 / (2^1) = 2 Inny przykład [4096 >> 11] = 4096 / (2^11) = 2
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-03-10 12:22:59
Spowoduje przesunięcie bitów przez wypełnienie tylu 0's
.
Dla ex,
- binarny
10
który jest cyfrą2
przesunięcie w lewo o 2 jest {[3] } który jest cyfrą8
- binarny
10
czyli cyfra2
przesunięcie w lewo o 3 to {[7] } czyli cyfra16
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
2013-02-08 15:14:43
Przesunięcie można zaimplementować z typami danych (char, int i long int). Zmiennoprzecinkowa i podwójna konotacja danych zostaną przesunięte.
value= value >> steps // Right shift, signed data.
value= value << steps // Left shift, signed data.
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-02-26 21:15:55
Signed left shift Logicznie Proste jeśli 1
W programowaniu java int a = 2
// it will result in 4096
2<<11 = 2*(2^11) = 4096
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
2018-06-26 04:38:49
Typowym zastosowaniem przesunięcia zmiennej i przypisania jej z powrotem może być przepisane operatorami stenograficznymi, >>=, lub >>>=, znane również w specyfikacji jako operatory przypisania złożonego .
Na przykład,
i >>= 2
Daje taki sam wynik jak
i = i >> 2
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
2018-08-15 23:20:58