Эквивалентный из Java утраивают оператор сдвига (>>>) в C#?

Это чрезвычайно простая реализация стека изображений - вам, вероятно, потребуется оптимизировать его для изображений с высоким разрешением.

<h1>ImageStack</h1>

<div class="container-fluid">
    <div class="row">@img</div>
    <div class="row"><img src="@img" onmousewheel="@MouseWheel" /></div>
</div>

@functions
{

  int imgNumber = 0;
  string img => $"/images/explosion {imgNumber}.png";

  Task MouseWheel(UIWheelEventArgs args)
  {
      imgNumber += Math.Sign(args.DeltaY);
      if (imgNumber == 43) imgNumber = 0;
      if (imgNumber == -1) imgNumber = 42;
      return Task.CompletedTask;
  }
}

DeltaY возвращает положительное или отрицательное число в зависимости от направления движения колесика мыши.

Я работаю с набором из 43 изображений с именем «взрыва N.png», где N варьируется от От 0 до 42.

Тег img имеет привязку «onmousewheel» к методу MouseWheel, который просто увеличивает или уменьшает imgNumber (и сохраняет его в диапазоне от 0 до 42).

img «src» связан со свойством «img», которое создает строку, указывающую на файл изображения под wwwroot.

Вам нужно будет настроить эту систему для любого способа хранения местоположений вашего изображения, который вам требуется.

30
задан Nayuki 19 April 2016 в 22:19
поделиться

6 ответов

В C # вы можете использовать целочисленные типы без знака, а затем << и >> делать то, что вы ожидаете. Документация MSDN по операторам смены дает вам подробную информацию.

Поскольку Java не поддерживает целые числа без знака (кроме char), этот дополнительный оператор стал необходим.

30
ответ дан Lucero 28 November 2019 в 00:02
поделиться

Прочитав это, я надеюсь, что мой вывод об использовании выглядит следующим образом. Если нет, то понимание приветствуется.

Java

i >>>= 1;

C #:

i = (int)((uint)i >> 1);
2
ответ дан KeithC 28 November 2019 в 00:02
поделиться

n >>> s в Java эквивалентно TripleShift (n, s), где:

    private static long TripleShift(long n, int s)
    {
        if (n >= 0)
            return n >> s;
        return (n >> s) + (2 << ~s);
    }
1
ответ дан Sebastien Lebreton 28 November 2019 в 00:02
поделиться

В C # нет оператора >>>. Но вы можете конвертировать ваши значения, такие как int, long, Int16, Int32, Int64, в unsigned uint, ulong, UInt16, UInt32, UInt64 и т. Д.

Вот пример.

    private long getUnsignedRightShift(long value,int s)
    {
        return (long)((ulong)value >> s);
    }
1
ответ дан Musakkhir Sayyed 28 November 2019 в 00:02
поделиться

Для моих VB.Net людей

Предложенные выше ответы дадут вам исключения переполнения с Option Strict ON

Попробуйте это, например, -100 >>> 2 с вышеуказанными решениями :

Следующий код всегда работает для >>>

Function RShift3(ByVal a As Long, ByVal n As Integer) As Long
        If a >= 0 Then
            Return a >> n
        Else
            Return (a >> n) + (2 << (Not n))
        End If
End Function
0
ответ дан Charles Okwuagwu 28 November 2019 в 00:02
поделиться

Java не имеет беззнакового сдвига влево ( <<< ), но в любом случае вы можете просто привести к uint и shfit из там.

Например

(int)((uint)foo >> 2); // temporarily cast to uint, shift, then cast back to int
13
ответ дан 28 November 2019 в 00:02
поделиться