设置给定的二进制标志

时间:2015-06-26 13:23:20

标签: binary bit-manipulation bitwise-operators

我有二进制数,我想将一个布尔值(true / false)应用于其中一个标志

假设一个名为myBinary的二进制值 我想将布尔值X应用于myBinary的第4个标志(0x08)

我知道我可以这样做:

function applyBoolean(int myBinary, int mask, boolean X)
{
  if (x = true)
     myBinary = myBinary | mask

  else 
     myBinary  = myBinary & mask 

  return myBinary
}

已编辑:

所以要改变第四个标志,我可以这样做:

applyBoolean(100101,001000,true)----->返回:101101

applyBoolean(100101,001000,false)----->返回:100101

现在我想知道是否可以在没有if / else的情况下使用,只使用按位运算。

由于

1 个答案:

答案 0 :(得分:0)

(我假设mask == 0x8 X == truemask == ~0x8 X == false,否则您的陈述与您的代码不匹配。)

为了使用"仅按位操作",您必须将该布尔值转换为数字。
由于您没有指定编程语言,我假设您正在寻找一般/概念性答案 但是,这是否可能取决于编程语言的特性,即将布尔值视为数字的能力。

例如,在JavaScript中可以这样做

function applyBoolean(myBinary, X)
{
    return (myBinary & ~0x8) ^ (X << 3);
}

这背后的逻辑相对简单:

  • 0x8位设置为0(通过按位AND与0x8的按位反转)。
  • 向左移动X 3位,隐式将其转换为数字。
  • XOR myBinary包含该值,导致0x8位为0X == false1

在PHP中,它实际上是相同的:

X == true

在Java中,仅使用按位运算符无法完成此操作,因为function applyBoolean($myBinary, $X) { return ($myBinary & ~0x8) ^ ($X << 3); } 无法转换为数字。您必须使用boolean,三元运算符或函数。

在某些语言中,例如C99之前的Assembly和C,这可能被认为是不适用的,因为这些语言缺少(真)布尔类型。
如果将if0视为布尔值,则解决方案与使用这些语言重写上述代码段一样简单。

最后(也可能是最少),一些语言,如Brainfuck,只是缺少布尔运算符,使得这个任务变得不可能。