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 kod
System.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ć?
Author: Steve Swinsburg, 2012-06-06

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

 181
Author: Kazekage Gaara,
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

 31
Author: Jigar Joshi,
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
 14
Author: star18bit,
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)

 11
Author: Hashmap,
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

 7
Author: Obothlale,
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 cyfra 2 przesunięcie w lewo o 3 to {[7] } czyli cyfra 16
 2
Author: Ramesh PVK,
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.
 2
Author: Student,
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
 1
Author: sunil rana,
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
 0
Author: Nicholas Sushkin,
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