代码之家  ›  专栏  ›  技术社区  ›  Robert Harvey

使用掩模在C中进行位操作

  •  5
  • Robert Harvey  · 技术社区  · 16 年前

    我需要一些关于C中位图操作的帮助#

    我想要一个 UInt16 ,隔离任意数量的位,并使用另一个 UIT16 价值。

    例子:

    10101010  -- Original Value
    00001100  -- Mask - Isolates bits 2 and 3
    
    Input        Output
    00000000  -- 10100010
    00000100  -- 10100110
    00001000  -- 10101010
    00001100  -- 10101110
                     ^^
    
    4 回复  |  直到 16 年前
        1
  •  8
  •   JSBÕ±Õ¸Õ£Õ¹    16 年前

    你似乎想要:

    (orig & ~mask) | (input & mask)
    

    前半部分将 orig 在里面 mask . 然后你做一个位或对位 input 那是在 面具 .

        2
  •  4
  •   Chris Taylor    16 年前
    newValue = (originalValue & ~mask) | (inputValue & mask);
    
    originalValue -> 10101010
    inputValue    -> 00001000  
    mask          -> 00001100 
    ~mask         -> 11110011
    
    (originalValue & ~mask)
      10101010
    & 11110011
    ----------
      10100010
          ^^
          Cleared isolated bits from the original value
    
    (inputValue & mask)
      00001000  
    & 00001100 
    ----------
      00001000
    
    
    newValue =      
      10100010
    | 00001000
    ----------
      10101010
    
        3
  •  1
  •   P Daddy    16 年前

    像这样?

    static ushort Transform(ushort value){
        return (ushort)(value & 0x0C/*00001100*/ | 0xA2/*10100010*/);
    }
    

    这将把您的所有样本输入转换为您的样本输出。更一般的说,你需要这样的东西:

    static ushort Transform(ushort input, ushort mask, ushort bitsToSet){
        return (ushort)(input & mask | bitsToSet & ~mask);
    }
    

    你可以这样称呼它:

    Transform(input, 0x0C, 0xA2);
    

    对于第一个函数的等效行为。

        4
  •  1
  •   Paul Sasik    16 年前

    这里的一些terser解决方案看起来似乎是合理的,尤其是JSBangs,但不要忘记,您还可以在System.Collections命名空间中使用方便的位数组集合: http://msdn.microsoft.com/en-us/library/system.collections.bitarray.aspx