鳳鳴は祖父の俳号

日記 メモ そんなの

ピットを数えないでパリティを求める

 PS/2キーボードのデータはoddパリティで保護されている。そのあたりのソース読んでいたら下位ビットから順に数えていた。確かに間違いないけど、大昔FM-7で遊んでて思いついた方法はループを使わなかった。ということで思い出しながら書いてみた。

 まず整理。パリティはデータのビットの数を数えて、奇数個か偶数個か判断する。evenパリティビットはデータの1が立っているビットの個数と足したら偶数個になるよう1/0を立てる。oddパリティビットはその逆。
http://ja.wikipedia.org/wiki/%E3%83%91%E3%83%AA%E3%83%86%E3%82%A3%E3%83%93%E3%83%83%E3%83%88

 と、Wikipediaを探したらそのものズバリがあった。あー。
https://groups.google.com/group/comp.lang.c/msg/e65b8577d041435b?hl=en&&pli=1

せっかくなので貼っておく。右シフトしてXOR、を繰り返すことで全bitのXORを求められる。
※シフト量が4,2,1になるよう差し替えました。

#include <stdio.h>

int even_parity_xor(unsigned int a) {
  unsigned int b;
  b=a>>4; //
  a=a^b;  // 76543210 XOR xxxx7654 -> xxxx_(7^3)(6^2)(5^1)(4^0)
  b=a>>2; //
  a=a^b;  // (7^3)(6^2)(5^1)(4^0) XOR xx_(7^3)(6^2) ->xx_ (7^3^5^1)(6^2^4^0)
  b=a>>1; //
  a=a^b;  // (7^6^5^4^3^2^1^0)
  return a & 1;
}

int even_parity(unsigned int val) {
  int i, count = 0;  // start with 0 for even parity
  for (i=0; i<8; i++) {
    if (val&1) count++;
    val = val>>1;
  }
  return count & 1; // bottom bit of count is parity bit
}

main() {
  int i;
  for(i=0;i<=255;i++) {
    printf("%d L,X %d %d\n",i,even_parity(i),even_parity_xor(i));
  }
}


 なお、80系だったらコンディションコード見ればすぐにわかる。

あと、ここ面白い。
http://graphics.stanford.edu/~seander/bithacks.html