www.kn34pc.com

Форум на силистренските радиолюбители
Дата и час: 27 Сеп 2020, 13:03

Часовете са според зоната UTC + 2 часа [ DST ]




Напиши нова тема Отговори на тема  [ 2 мнения ] 
Автор Съобщение
МнениеПубликувано на: 05 Авг 2020, 19:42 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1099
Местоположение: Силистра
Извличане на контролен бит по четност в данни от произволен тип?
(uint64_t за конкретния случай)


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 11 Авг 2020, 16:33 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1099
Местоположение: Силистра
- първи вариант, който ми дойде наум:
брой на единици от бит_0 до бит_X,
проверка остатъка при делене на 2 (%2): 1 (нечетно), 0 (четно)
но въобще не го пробвах.

- втори вариант:
начален бит "сума по модул две" (изключващо ИЛИ, XOR) със следващия бит, до края (може и наобратно: до началото). Работи.

за целите на необходимото пресмятане:
parity от бит m_start до бит m_stop

Код за потвърждение:
bool parity_u64(uint64_t x, uint8_t m_start, uint8_t m_stop) {  // parity check, false: odd, true: even
  bool p = 0;

  x >>= m_start;
  for (uint8_t i = m_start; i <= m_stop; i++) {
    p ^= (x & 0x01);
    x >>= 1;
  }
  return p;
}

Проверка с число от конкретния ми пример:

uint64_t h = 0b0000100100000110010011100001101001001100001000001000000100000000;
Serial.println(parity_u64(h, 31, 63));

пресметнато с молива: 1 :mail, получено през Serial monitor: 1 :comp.


Върнете се в началото
 Профил  
 
Покажи мненията от миналия:  Сортирай по  
Напиши нова тема Отговори на тема  [ 2 мнения ] 

Часовете са според зоната UTC + 2 часа [ DST ]


Кой е на линия

Потребители, разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
cron
Форумът се задвижва от phpBB® Forum Software © phpBB Group
Преведено от yarnaudov.com