Итак, давайте начнем с 32 разрядными целым числом:битой манипуляция на больших целых числах диапазона «Int»
int big = 536855551; // 00011111111111111100001111111111
Теперь я хочу, чтобы установить последние 10 бит в пределах этого целый:
int little = 69; // 0001101001
Итак, мой подход был таков:
big = (big & 4294966272) & (little)
где 4294966272
это первые 22 бита, или 11111111111111111111110000000000
,
Но, конечно, это не поддерживается, потому что 4294966272
находится вне диапазона int
0x7FFFFFFF
. Кроме того, это не моя единственная операция. Я также должен быть в состоянии установить биты 11 до 14. Мой подход к этому (с той же проблемой) было:
big = (big & 4294951935) | (little << 10)
Так с объяснением из пути, вот что я делать, как альтернативные для выше:
1: ((big >> 10) << 10) | (little)
2: (big & 1023) | ((big >> 14) << 14) | (little << 10)
Я не чувствую, что моя альтернатива являются лучшим, эффективным способом я мог бы пойти. Есть ли лучшие способы сделать это?
Sidenote: Если C# поддерживает бинарные литералы, '0b'
, это было бы намного красивее.
Спасибо.
использование BigInteger .....? –
@MitchWheat Это никогда не приходило мне в голову ... Можете ли вы показать мне пример (желательно, как ответ, если он работает, я могу его принять), который будет отражать мои примеры выше? –
https://msdn.microsoft.com/en-us/library/system.numerics.biginteger_operators(v=vs.110).aspx –