public struct MyBool
{
    private byte _val;
    public byte Value
    {
        get { return _val; }
        set { _val = (byte)(value == 0 ? 0 : 1); }
    }
    public MyBool(int a)
    {
        _val = (byte)(a == 0 ? 0 : 1);
    }
    public override string ToString()
    {
        return _val == 0 ? "0" : "1";
    }
    public override int GetHashCode()
    {
        return _val;
    }
    public override bool Equals(object obj)
    {
        return _val == ((MyBool)obj).Value;
    }
    public static implicit operator MyBool(int a)
    {
        return new MyBool(a);
    }
    public static implicit operator int(MyBool a)
    {
        return a._val;
    }
}
MyBool[] arr1 = {1, 0, 1, 1, 0, 0, 0, 1};
MyBool[] arr2 = {1, 0, 2, 3, 0, 0, 0, -5}; 
// автоматически преобразуется в {1, 0, 1, 1, 0, 0, 0, 1}
// во всех си-подобных языках не-ноль - это истина