Понимание побитового оператора с int list [duplicate]

Как и @Maximiliangerhardt, MiniJson не имеет возможности десериализоваться должным образом. Я использовал JsonFx и работал как шарм. Работает с []

player[] p = JsonReader.Deserialize<player[]>(serviceData);
Debug.Log(p[0].playerId +" "+ p[0].playerLoc+"--"+ p[1].playerId + " " + p[1].playerLoc+"--"+ p[2].playerId + " " + p[2].playerLoc);
13
задан 9 revs, 7 users 43% 14 September 2012 в 22:55
поделиться

4 ответа

<< - оператор сдвига слева; это берет двоичное представление значения и перемещает все биты «n» влево (кроме «mod», см. «1»), заполняя нули нулями.

>> - оператор правого сдвига; это делает почти противоположное (перемещение вправо), за исключением знаковых значений (т. е. тех, которые могут быть отрицательными), он заполняет 1 с для отрицательных значений, а остальные нули.

1:

Оператор сдвига по существу является «mod» шириной данных. Int - 32 бита, поэтому сдвиг влево 33 (в Int32) точно такой же, как сдвиг влево 1. Вы не получаете все нули. A long - 64 бита, поэтому сдвиг влево 33 дает другой ответ (исходное время 2 ^ 33).

2:

Каждый сдвиг влево (в пределах данных ширина) одинакова (для целых чисел) как x2 - так что & lt; 4 равно x2x2x2x2 = x16.

Это простой двоичный файл:

0000000001 = 1

& lt; переходит в

0000000010 = 2

& lt; переходит в

0000000100 = 4

& lt; переходит в

0000001000 = 8
38
ответ дан 2 revs 22 August 2018 в 00:04
поделиться
  • 1
    Привет, могу я попросить вас объяснить это больше? В первом, почему у меня есть 0x200000000, а во втором - почему у меня 16000? Спасибо большое – Sara S 20 January 2009 в 11:14
  • 2
    Это похоже на высказывание «почему 1 * 50000 отличается от 1000 * 8». - потому что вы делаете совсем другие вещи. Первая - 2 ^ 33 («сила»), вторая - 1000 * 16. – Marc Gravell♦ 20 January 2009 в 11:21
  • 3
    хорошо я понимаю разницу между 2 ^ 33 и 1000 * 16, я хочу знать, почему 2 ^ 32 – Sara S 20 January 2009 в 11:32
  • 4
    33 есть int (2 ^ 5), теперь для перехода к длинному (2 ^ 6), почему 2 ^ 33? Спасибо – Sara S 20 January 2009 в 11:37
  • 5
    1 & lt; 1 = 2 = 2 ^ 1; 1 & lt; 2 = 4 = 2 ^ 2; 1 & lt; 33 = ... = 2 ^ 33 (долго, а не для int) – Marc Gravell♦ 20 January 2009 в 11:42

Еще несколько заметок для начинающего программиста:

Зачем использовать операторы сдвига? Они, похоже, не очень много делают. Ну, есть две причины:

  1. Они очень быстры, потому что почти у всех ЦП есть сдвиговые регистры, что означает, что операция переключения выполняется в аппаратном обеспечении в минимальном количестве усилий (циклов).
  2. Поскольку они работают быстро, для этого используется множество протоколов и стандартов. Например, операции с IP-адресом, проверка CRC, графические операции и т. Д.
3
ответ дан 2 revs, 2 users 80% 22 August 2018 в 00:04
поделиться

«Оператор сдвига по существу является« mod »шириной данных».

Мусор! Если величина сдвига больше или равна ширине данных, результат не определен. Не ожидайте того же самого «мода», который вы видели, чтобы произойти с разными компиляторами или разными версиями одного и того же компилятора или в разных ситуациях смены в одной и той же программе или когда что-либо еще изменилось. Вот что означает «неопределенный».

1
ответ дан greg 22 August 2018 в 00:04
поделиться
  • 1
    актуальная спецификация языка C # 4.0 говорит: 1) Когда тип x является int или uint, счетчик сдвига задается младшими пятью битами счета. Другими словами, подсчет сдвига вычисляется из count & amp; 0x1F. 2) Когда тип x длинный или улунгов, счетчик сдвига задается шестью битами младшего порядка. Другими словами, подсчет сдвига вычисляется из count & amp; 0x3F. – Ivan 12 July 2012 в 09:12

Чтобы немного расширить ответ от Marc (Марк, не стесняйтесь включать это в свой, и я удалю этот ответ), это указано в разделе 7.8 спецификации:


предопределенные операторы сдвига перечислены ниже.

Сдвиг влево:

  • int operator & lt; (int x, int count);
  • uint operator & lt; (uint x, int count);
  • длинный оператор & lt; (long x, int count);
  • ulong operator & lt; (ulong x, int count);

. & lt; оператор смещает x слева на число бит, вычисленное, как описано ниже.

Биты высокого порядка вне диапазона результата результата x отбрасываются, остальные биты сдвигаются влево, а младшие разряды пустые позиции битов установлены на ноль.

Сдвиг вправо:

  • int operator >> (int x, int count);
  • uint operator> > (uint x, int count);
  • long operator >> (long x, int count);
  • ulong operator >> (ulong x, int count);

Оператор >> сдвигает x справа на число бит, вычисленное, как описано ниже.

Когда x имеет тип int или long, младшие биты x отбрасываются оставшиеся биты сдвигаются вправо, а старшие разряды старшего разряда устанавливаются на ноль, если x неотрицательно и устанавливается в единицу, если x отрицательно.

Когда x имеет тип uint или ulong , младшие разряды x отбрасываются, остальные биты сдвигаются вправо, а позиции пустого разряда высокого порядка устанавливаются на ноль.

Для предопределенных o число бит для сдвига вычисляется следующим образом:

Когда тип x является int или uint, счетчик сдвига задается младшими пятью битами счета. Другими словами, подсчет сдвига вычисляется из count & amp; 0x1F.

Когда тип x длинный или ulong, счетчик сдвига задается шестью битами младшего порядка. Другими словами, подсчет сдвига вычисляется из count & amp; 0x3F.

Если итоговое значение сдвига равно нулю, операторы сдвига просто возвращают значение x.


7
ответ дан Jon Skeet 22 August 2018 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: