Как мне однозначно хранить 4 целых в одном int (C#)? - PullRequest
0 голосов
/ 19 июня 2020

Допустим, у меня есть следующие четыре int:

int a = 4;
int b = 5;
int c = 6;
int d = 7;

Я хочу сохранить эти значения в одном int:

int whole;

Как бы это сделать с помощью побитового / сдвига операции? Я пробовал:

int whole = a + (b << 8) + (c << 16) + (d << 24);

Но я не уверен, что это создаст уникальные значения для всего, потому что я также хочу получить целые числа обратно из целого. Итак, если у меня есть, например, целое = 5919835, я хочу вернуть значение c.

1 Ответ

5 голосов
/ 19 июня 2020

Вы можете сжать a, b, c и d в один int, если все a, b, c и d находятся в диапазоне [0..255] т.е. если они на самом деле byte s:

 int whole = unchecked(a | (b << 8) | (c << 16) | (d << 24));

примечание unchecked (когда d > 127 у вас может быть целочисленное переполнение , поскольку int целое число со знаком ). Технически + подойдет, но | (побитовое или) кажется более читаемым.

Реверс:

a = whole & 0xFF;
b = (whole >> 8) & 0xFF;
c = (whole >> 16) & 0xFF;
d = (whole >> 24) & 0xFF;
...