Побитовый сдвиг в Swift отличается от Java - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь перевести RGB в ColorInt, как в Java.

Java: Приведенный ниже код возвращает '-16777216' для черного цвета.

int a = 255;
int r = 0;
int g = 0;
int b = 0;

int hcol = 0;
hcol |= (a & 0xFF) << 24;
hcol |= (r & 0xFF) << 16;
hcol |= (g & 0xFF) << 8;
hcol |= b & 0xFF;
System.out.println(hcol);

Swift: Из того, что я знаю, должен быть тот же самый точный код, что и в примере с Java.Но он возвращает только положительные числа и равен «0» для черных, где «16777216» (не отрицательный) - белый.

let a = 255
let r = 0;
let g = 0;
let b = 0;

var colInt = 0;
//colInt |= (a & 0xFF) << 24; (Adding this makes the variable even bigger)
colInt |= (r & 0xFF) << 16;
colInt |= (g & 0xFF) << 8;
colInt |= (b & 0xFF);

print("\(colInt)");

Как вы можете видеть на примере Swift, у меня нет альфацвет.Если я добавлю, что это просто делает колинт еще большим числом, чем максимальное количество цветов в спектре RGB.

1 Ответ

0 голосов
/ 29 ноября 2018

Скорее всего, вы работаете на 64-битной машине, поэтому тип swift Int на самом деле 64-битный, а java int всегда 32-битный.То «большее число», которое вы видите (4278190080), на самом деле 0x00000000FF000000 в 64-битном целом числе.Использование Int32 должно дать ожидаемый результат.

let a : Int32 = 255
let r : Int32 = 0;
let g : Int32 = 0;
let b : Int32 = 0;

var colInt : Int32 = 0;
colInt |= (a & 0xFF) << 24;
colInt |= (r & 0xFF) << 16;
colInt |= (g & 0xFF) << 8;
colInt |= (b & 0xFF);

print("\(colInt)");    //-16777216
...