public static UInt32 FoldAsUInt32(this UInt32[] values, BitOperationMode mode) { int count = values.Length; int i, j; int k = 0; var barr = values.ToBooleans(); UInt32 rlt = 0; switch (mode) { default: { for (i = 0; i < sizeof(UInt32); i++) { bool b = false; for (j = 0; j < count; j++) { b |= barr[k++]; if (b) { k += count - j - 1; break; } } rlt.SetBit(i, b); } return(rlt); } case BitOperationMode.And: { for (i = 0; i < sizeof(UInt32); i++) { bool b = false; for (j = 0; j < count; j++) { b &= barr[k++]; if (!b) { k += count - j - 1; break; } } rlt.SetBit(i, b); } return(rlt); } case BitOperationMode.NotOr: { for (i = 0; i < sizeof(UInt32); i++) { bool b = false; for (j = 0; j < count; j++) { b |= !barr[k++]; if (b) { k += count - j - 1; break; } } rlt.SetBit(i, b); } return(rlt); } case BitOperationMode.NotAnd: { for (i = 0; i < sizeof(UInt32); i++) { bool b = false; for (j = 0; j < count; j++) { b &= !barr[k++]; if (!b) { k += count - j - 1; break; } } rlt.SetBit(i, b); } return(rlt); } } }