/// <summary> /// Присвоить признак по указанному адресу (номеру бита) /// </summary> /// <param name="opt">Значение признака</param> /// <param name="bit">Номер бита</param> private void marked(bool opt, int bit) { Int32 val = HMath.Pow2(bit); if (opt == true) { if (!((m_mark & val) == val)) { m_mark += val; ValueChanged?.Invoke(val); } else { ; } } else if ((m_mark & val) == val) { m_mark -= val; ValueChanged?.Invoke(val); } else { ; } }
/// <summary> /// Проверить установлено ли значение признака в ИСТИНА по адресу (номеру бита) и доп./смещению /// </summary> /// <param name="val">Все значения признаков</param> /// <param name="bit">Номер бита</param> /// <param name="offset">Доп./смещение</param> /// <returns>Признак установки значения</returns> public static bool IsMarked(int val, int bit, int offset = 0) { bool bRes = false; if ((val & HMath.Pow2(bit, offset)) == HMath.Pow2(bit, offset)) { bRes = true; } else { ; } return(bRes); }
/// <summary> /// Добавить истинные признаки при их отсутствии /// </summary> /// <param name="mark">Исходное значение для всех признаков</param> public void Add(HMark mark) { int cntBit = -1 , valChanged = 0; Delegate [] arHandler = ValueChanged == null ? new Delegate [] { } : ValueChanged.GetInvocationList(); foreach (DelegateIntFunc f in arHandler) { ValueChanged -= f; } cntBit = sizeof(Int32) * 8; for (int i = 0; i < cntBit; i++) { if ((IsMarked(mark.Value, i) == true) && (IsMarked(i) == false)) { marked(true, i); valChanged += HMath.Pow2(i); } else { ; } } foreach (DelegateIntFunc f in arHandler) { ValueChanged += new DelegateIntFunc(f); } ValueChanged?.Invoke(valChanged); }