我有二进制数,我想将一个布尔值(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的情况下使用,只使用按位运算。
由于
答案 0 :(得分:0)
(我假设mask == 0x8
X == true
而mask == ~0x8
X == false
,否则您的陈述与您的代码不匹配。)
为了使用"仅按位操作",您必须将该布尔值转换为数字。
由于您没有指定编程语言,我假设您正在寻找一般/概念性答案
但是,这是否可能取决于编程语言的特性,即将布尔值视为数字的能力。
例如,在JavaScript中可以这样做
function applyBoolean(myBinary, X)
{
return (myBinary & ~0x8) ^ (X << 3);
}
这背后的逻辑相对简单:
0x8
位设置为0
(通过按位AND与0x8
的按位反转)。X
3位,隐式将其转换为数字。myBinary
包含该值,导致0x8
位为0
,X == false
为1
。在PHP中,它实际上是相同的:
X == true
在Java中,仅使用按位运算符无法完成此操作,因为function applyBoolean($myBinary, $X)
{
return ($myBinary & ~0x8) ^ ($X << 3);
}
无法转换为数字。您必须使用boolean
,三元运算符或函数。
在某些语言中,例如C99之前的Assembly和C,这可能被认为是不适用的,因为这些语言缺少(真)布尔类型。
如果将if
和0
视为布尔值,则解决方案与使用这些语言重写上述代码段一样简单。
最后(也可能是最少),一些语言,如Brainfuck,只是缺少布尔运算符,使得这个任务变得不可能。