2016-06-10 3 views
-1

У меня есть идея о том, как предотвратить однократное переворачивание (из-за космического излучения или аналогичного события, вызванного извне) из-за того, что перечисления (перечисление) изменяются от одного определенного значения до другое определенное значение относительно простым способом. Проще говоря, каждое значение должно иметь четное количество единиц, двоичный разговор. Если один щелкнуть, перечисление будет нечетным и гарантированно не будет соответствовать ни одному другому перечислению.Как создать набор перечислений с четным числом единиц

Я не уверен, как на самом деле «сгенерировать» такую ​​последовательность, чтобы ее можно использовать в качестве значений перечисления, поскольку эти значения должны быть константой времени компиляции. Макрофункция, возвращающая элемент n: th в наборе, будет работать отлично.

Первые несколько чисел в последовательности будут 0 (000), 3 (011), 5 (101), 6 (110). Я думаю, вы поняли эту идею.

Ответы на неперечисление (не компилируемое время) оцениваются, так как это может помочь мне понять, как это сделать сам.


Чтобы сделать себе ясно, что я хочу макрос, генерирующий п: е чисел в перечислении с четным числом единиц в двоичных разрядах, подобных макросы, порождающих последовательность fibbonachi. Самый младший бит по существу является битом четности.

Большая часть моей памяти защищена аппаратными средствами ECC, а кеш L1 является одним из исключений. Одна бит-ошибка в L1 была измерена как раз каждые 10000 часов, что достаточно хорошо видно из моих требований.

VRAM однако не защищен. Там у меня в основном RGB (A) растровый, несколько растровых растровых объектов (например, трафарет) и некоторая геометрия. Растровый RGB довольно нечувствителен к бит флип, поскольку он используется только для визуализации. Ошибочная геометрия в целом очень заметна, очень редка (несколько килобайт) и по дизайну должна быть разрешена путем перезагрузки, вызванной пользователем.

Для бинарных ошибок в размере 4096x4096x8 бит (~ 16 МБ) в моей среде примерно раз в 8 часов для средней космической радиации, чаще всего во время солнечных бурь. На мой взгляд, это не так уж плохо, но мне бы не хотелось заполнять бумажную работу, подтверждающую моих офицеров, почему это прекрасно в моем приложении, и каждый из них использует данные трафарета, независимо от того, как используются данные. Если иметь значение бита четности в значении трафарета, я бы смог обнаружить большинство ошибок и, если необходимо, повторно сгенерировать трафарет, надеясь получить лучшие результаты. Трафарет может быть сгенерирован менее чем за секунду, поэтому риск ошибок, возникающих дважды подряд, считается низким.

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

+2

и что, если два бита получить переворачивается? мы здесь не для разработки вашей системы/кода для вас. Мы исправим то, что вы написали. все остальное просто мы делаем вашу работу за вас. –

+0

Подумайте о комбинациях: все возможные 2 бита из 16; то все возможные 4 бита из 16; 6/16; 8/16 и т. Д. –

+0

Я не вижу смысла в этом методе, потому что он не обеспечивает механизм для восстановления перечисления после того, как бит был перевернут; если вы видите '001' его двусмысленным, должно ли оно быть' 0', '3' или' 5' – vu1p3n0x

ответ

2

Если вы просто хотите знать, является ли переименование действительным или если бит перевернут, вы можете использовать любые значения и бит четности, что делает общее количество бит четным. (Что это первая последовательность идентична ваш пример)

0000000 0 = 0 
0000001 1 = 3 
0000010 1 = 5 
0000011 0 = 6 
0000100 1 = 9 
0000101 0 = 10 
0000110 0 = 12 
0000111 1 = 15 

, который может быть сделан

int encode_enum(int e) { 
    return (e << 1) + (number_of_bits_set(e) % 2); 
} 

Однако, если вы хотите, чтобы иметь возможность восстановить значение, то простой способ дублирования; имеют несколько копий значения, которое может быть позже сравнено с eachother. Вам понадобится 3 копии, чтобы восстановить его. Если ваш список значений невелик, вы можете закодировать его в одно целое.

int encode_enum(int e) { 
    return (e << 20) | (e << 10) | e; 
} 

Что, если e меньше 2^10 просто копируется 3 раза в один 32-разрядного целого числа.

+0

You есть интересный момент о возможном восстановлении, просто имея дубликаты в значении. Хотя это и не является частью вопроса, это очень ценная информация. – Andreas

1

C++ 14-х constexpr решает это для вас:

#include <iostream> 

constexpr int bit_count(int val) 
{ 
    int count = 0; 
    for (int i = 0 ; i < 31 ; ++i) { 
     if (val & (1 << i)) 
      ++count; 
    } 
    return count; 
} 

constexpr int next_bitset(int last) 
{ 
    int candidate = last + 1; 
    if (bit_count(candidate) & 1) 
     return next_bitset(candidate); 
    return candidate; 
} 
enum values 
{ 
    a, 
    b = next_bitset(a), 
    c = next_bitset(b), 
    d = next_bitset(c) 
}; 

int main() 
{ 
    std::cout << "a = " << a << std::endl; 
    std::cout << "b = " << b << std::endl; 
    std::cout << "c = " << c << std::endl; 
    std::cout << "d = " << d << std::endl; 
} 

ожидается выход:

a = 0 
b = 3 
c = 5 
d = 6 
+0

Я застрял с C99 еще пару лет, но это будет полезно для меня, когда наступит подходящее время, а для других - в современных условиях. – Andreas

+0

@ andreas стыд. Какая организация намеренно живет в темные века? Я думаю, что ваша забота о космических космических частицах немного преувеличена. Для перевертывания требуется несколько блуждающих мюонов. Если это реальная проблема, CRC или еще более сложный хеш обеспечит вам лучшую защиту, чем только четность. –

+0

Военные организации. Старые технологии гораздо более надежны и имеют лучшие показатели обслуживания. Мы сделали выводы, основанные на измерениях в лабораториях, осыпающих оборудование частицами в соответствии со стандартами сертификации, применимыми к нашему продукту. CRC фиксирует ошибки в коде, а не пользовательские данные. Хеширование 16-миллионного времени выполнения элементов за менее чем одну секунду (по старой технологии) просто невозможно. – Andreas