Example #1
0
        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);
            }
            }
        }