Знак, идущий от постоянной битовой ширины в C # - PullRequest
2 голосов
/ 20 октября 2010

У меня есть значение длиной 5 бит.4 бита определяют число, а 5-й бит определяет знак, удерживая любое значение в диапазоне от -16 до +15.Как я могу выполнить знак, расширяющийся от постоянной битовой ширины в C #?Я знаю, в C, я могу использовать что-то вроде следующего, чтобы выполнить это:

int x; // convert this from using 5 bits to a full int
int r; // resulting sign extended number goes here
struct {signed int x:5;} s;
r = s.x = x;

Как я могу сделать что-то подобное в C #?

Ответы [ 5 ]

2 голосов
/ 06 июня 2012

Я знаю, что это старый вопрос, но для будущих искателей у меня есть больше информации.

C # не поддерживает настраиваемую битовую ширину, но поддерживает двоичные операции и методы получения / установки, что позволяет относительно легко добавить слой совместимости. Например, если вы хотите хранить необработанные данные в байте _num, но хотите иметь возможность взаимодействовать с ним, используя стандартный C # -байт, вы можете использовать следующее:

byte _num;
sbyte num {
    get
    {
        return (sbyte)(((_num & 0x10) << 3) | (_num & 0x0F));
    }
    set
    {
        _num = (byte)((value & 0x0F) | ((value & 0x80) >> 3));
    }
}

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

2 голосов
/ 20 октября 2010

Не совсем понятно, что вы имеете в виду, но может быть таким простым:

int fiveBits = normal & 0x1f;

и наоборот:

int normal =  fiveBits < 16 ? fiveBits : fiveBits | -32;

мог бы предложить какой-то оригинальный ввод и желаемый вывод, который бы помог.

1 голос
/ 20 октября 2010

Я просто пишу функцию C (потому что я на самом деле не знаю C #), которая будет делать это, используя операции, которые, я знаю, доступны в C #.

int five_bit_to_signed(int five_bit) {
     int sh = (sizeof(int)*8)-5;
     int x = five_bit << sh; // puts your sign bit in the highest bit.
     return x >> sh;  // since x is signed this is an arithmatic signed shift
}
1 голос
/ 20 октября 2010

Выполните сдвиг влево, а затем арифметический сдвиг вправо, чтобы переместить знаковый бит в верхнее положение, а затем назад.Арифметическое смещение вправо выполнит расширение знака для вас.

Конечно, это зависит от наличия операции арифметического смещения.Абстрактный язык C не работает (он определяется реализацией, работает он или нет), но большинство реализаций работают.Я не уверен насчет C #, но думаю, что он есть.

0 голосов
/ 29 марта 2012

Судя по вашему вопросу, вы хотите иметь структуру, которую можно легко преобразовать в int тип:

struct FiveBit
{
  public int bits;

  public static implicit operator int(FiveBit f)
  {
    return (f.bits & 0x10) == 0 ? f.bits : f.bits | -32;
  }

  public static implicit operator FiveBit(int r)
  {
    return new FiveBit() { bits = r & 0x1f };
  }
}

А вот пример использования:

class FiveBitTest
{
  static void Main(string[] args)
  {
    FiveBit f = new FiveBit();
    int r; // resulting sign extended number goes here

    f.bits = 0;
    r = f;
    Console.WriteLine("r = {0}, f.bits = 0x{1:X}", r, f.bits);

    f.bits = 0x1f;
    r = f;
    Console.WriteLine("r = {0}, f.bits = 0x{1:X}", r, f.bits);

    r = -2;
    f = r;
    Console.WriteLine("r = {0}, f.bits = 0x{1:X}", r, f.bits);
}

Вывод выше:

r = 0, f.bits = 0x0
r = -1, f.bits = 0x1F
r = -2, f.bits = 0x1E
...