Скажем, у меня есть значение ushort, которое я хотел бы установить биты от 1 до 4 включительно (при условии, что 0 - это LSB, а 15 - MSB).Set Range Bits в ushort
В C++ можно определить структуру, которая отображенный конкретные биты:
struct KibblesNBits
{
unsigned short int TheStart: 1;
unsigned short int TheMeat: 4;
unsigned short int TheRest: 11;
}
Затем можно присвоить значение «TheMeat» непосредственно. Я хочу сделать что-то подобное на C#. В идеале я хотел бы определение несильно, который выглядел так:
public ModValue SetRange<ModValue, RangeValue>(ModValue valueToMod, int startIndex, int endIndex, RangeValue rangeValueToAssign)
Это также должно было бы Валиде, что rangeValueToAssign не превышает максимального размера (предполагающие значения без знака от 0 до макс). Поэтому, если диапазон от 1 до 4, это 4 бита, диапазон будет от 0 до 15. Если он выходит за эти пределы, выкиньте исключение.
Я ничего не нашел в классе BitConverter, который мог бы сделать что-то вроде этого. Лучше всего я мог подумать о том, чтобы использовать мануальные сдвиговые операторы. Есть лучший способ сделать это?
Изменить: не общая версия может выглядеть примерно так:
public static ushort SetRange(ushort valueToMod, int startIndex, int endIndex, ushort rangeValueToAssign)
{
// Determine max value
ushort max_value = Convert.ToUInt16(Math.Pow(2.0, (endIndex - startIndex) + 1.0) - 1);
if(rangeValueToAssign > max_value) throw new Exception("Value To Large For Range");
// Shift the value and add it to the orignal (effect of setting range?)
ushort value_to_add = (ushort)(rangeValueToAssign << startIndex);
return (ushort)(valueToMod + value_to_add);
}
Где:
ushort new_val = SetRange(120, 1, 2, 3);
приведет к 'new_val' быть установлен в 126.
Что не так с операторами сдвига? они обеспечили бы лучшую производительность здесь ... – TJMonk15
@ TJMonk15 - Я думаю, с ними ничего не случилось, просто искали универсальное решение или посмотрели, есть ли другой способ сделать это, что я просто отсутствую – SwDevMan81
Прошу опубликовать фрагмент код, иллюстрирующий, как вы хотели бы использовать это устройство. Я все еще немного неясен относительно того, что вы хотите сделать SetRange, в точности. –