ROOT logo
UShort_t Encode(UShort_t d, Char_t r)
{
  UShort_t q = (r == 'I' || r == 'i') ? 0 : 1;
  UShort_t c = 1 << (d-1);
  UShort_t t = 1 << (c+q-1);

  return t;
 // return (1 << q) | (1 << (d+1));

}
void Decode(UShort_t bits, UShort_t& d, Char_t& r)
{
  if      (bits & 0x1)  { d = 1; r = 'I'; }
  else if (bits & 0x6)  { d = 2; r = (bits & 0x2 ? 'I' : 'O'); }
  else if (bits & 0x18) { d = 3; r = (bits & 0x8 ? 'I' : 'O'); }
}

const Char_t* ShowBits(UShort_t bits, Char_t* buf)
{
  // Char_t buf[7];
  // for (Int_t i = 0; i < 6; i++) buf[i] = ' ';
  for (Int_t i = 0; i < 6; i++) {
    buf[5-i] = (bits & (1 << i)) ? '1' : '0';
  }
  buf[6] = '\0';
  return buf;
}

void TestOne(UShort_t d, Char_t r)
{
  UShort_t bits = Encode(d, r);
  UShort_t rd   = 0;
  Char_t   rr   = 0;
  Char_t   buf[7];
  Decode(bits, rd, rr);
  ShowBits(bits, buf);
  
  Printf("FMD%d%c -> 0x%02x (%s) -> FMD%d%c", d, r, bits, buf, rd, rr);
}

enum {/*
  kFMD1i = 0x05,
  kFMD1  = kFMD1i,
  kFMD2i = 0x09,
  kFMD2o = 0x0a,
  kFMD2  = kFMD2i|kFMD2o,
  kFMD3i = 0x11,
  kFMD3o = 0x12,
  kFMD3  = kFMD3i|kFMD3o*/
  kFMD1I=0x01,
  kFMD1 =kFMD1I,
  kFMD2I=0x02,
  kFMD2O=0x04,
  kFMD2 =kFMD2I|kFMD2O,
  kFMD3I=0x08,
  kFMD3O=0x10,
  kFMD3 =kFMD3I|kFMD3O
};

UShort_t T(UShort_t m, UShort_t t)
{
  return (m & t) == t;
}
void TestEnum(UShort_t e, const char* n)
{
  Printf(" %10s | %5x | %5x | %5x | %5x | %5x |", 
	 n, T(e,kFMD1I), T(e,kFMD2I), T(e,kFMD2O), T(e,kFMD3I), T(e,kFMD3O));
}
void TestEnums()
{
  Printf(" Enum       | FMD1i | FMD2i | FMD2o | FMD3i | FMD3o |");
  TestEnum(kFMD1I, "FMD1i");
  TestEnum(kFMD1,  "FMD1");
  TestEnum(kFMD2I, "FMD2i");
  TestEnum(kFMD2O, "FMD2o");
  TestEnum(kFMD2,  "FMD2");
  TestEnum(kFMD3I, "FMD3i");
  TestEnum(kFMD3O, "FMD3o");
  TestEnum(kFMD3,  "FMD3");
  TestEnum(kFMD3|kFMD2,  "FMD23");
  TestEnum(kFMD1|kFMD2,  "FMD12");
  TestEnum(kFMD3|kFMD2O,  "FMD32o");
  TestEnum(kFMD3I|kFMD2O,  "FMD3i2o");
  TestEnum(kFMD1I|kFMD2O,  "FMD1i2o");
  TestEnum(kFMD1I|kFMD2O|kFMD3I,  "FMD3i2o1i");
  TestEnum(kFMD1I|kFMD2I|kFMD3I,  "FMD3i2i1i");
  TestEnum(kFMD2O|kFMD3O,  "FMD3o2o");
  TestEnum(0xff,  "All");
}

void RingBits()
{
  TestOne(1, 'I');
  TestOne(2, 'I');
  TestOne(2, 'O');
  TestOne(3, 'I');
  TestOne(3, 'O');

  TestEnums();
}
 RingBits.C:1
 RingBits.C:2
 RingBits.C:3
 RingBits.C:4
 RingBits.C:5
 RingBits.C:6
 RingBits.C:7
 RingBits.C:8
 RingBits.C:9
 RingBits.C:10
 RingBits.C:11
 RingBits.C:12
 RingBits.C:13
 RingBits.C:14
 RingBits.C:15
 RingBits.C:16
 RingBits.C:17
 RingBits.C:18
 RingBits.C:19
 RingBits.C:20
 RingBits.C:21
 RingBits.C:22
 RingBits.C:23
 RingBits.C:24
 RingBits.C:25
 RingBits.C:26
 RingBits.C:27
 RingBits.C:28
 RingBits.C:29
 RingBits.C:30
 RingBits.C:31
 RingBits.C:32
 RingBits.C:33
 RingBits.C:34
 RingBits.C:35
 RingBits.C:36
 RingBits.C:37
 RingBits.C:38
 RingBits.C:39
 RingBits.C:40
 RingBits.C:41
 RingBits.C:42
 RingBits.C:43
 RingBits.C:44
 RingBits.C:45
 RingBits.C:46
 RingBits.C:47
 RingBits.C:48
 RingBits.C:49
 RingBits.C:50
 RingBits.C:51
 RingBits.C:52
 RingBits.C:53
 RingBits.C:54
 RingBits.C:55
 RingBits.C:56
 RingBits.C:57
 RingBits.C:58
 RingBits.C:59
 RingBits.C:60
 RingBits.C:61
 RingBits.C:62
 RingBits.C:63
 RingBits.C:64
 RingBits.C:65
 RingBits.C:66
 RingBits.C:67
 RingBits.C:68
 RingBits.C:69
 RingBits.C:70
 RingBits.C:71
 RingBits.C:72
 RingBits.C:73
 RingBits.C:74
 RingBits.C:75
 RingBits.C:76
 RingBits.C:77
 RingBits.C:78
 RingBits.C:79
 RingBits.C:80
 RingBits.C:81
 RingBits.C:82
 RingBits.C:83
 RingBits.C:84
 RingBits.C:85
 RingBits.C:86
 RingBits.C:87
 RingBits.C:88
 RingBits.C:89
 RingBits.C:90
 RingBits.C:91
 RingBits.C:92
 RingBits.C:93
 RingBits.C:94
 RingBits.C:95
 RingBits.C:96
 RingBits.C:97
 RingBits.C:98
 RingBits.C:99
 RingBits.C:100
 RingBits.C:101