【问题标题】:How i can set several definite bits of integer to concrete values?我如何将几个确定的整数位设置为具体值?
【发布时间】:2019-05-27 04:48:27
【问题描述】:

我正在尝试使用按位运算符对存储在整数中的权限进行一些工作,但尝试在一行中将几个确定的位设置为 10 时卡住了。

我当前的代码是:

function setPermission(int $permissions, int $type, bool $value)
{
    return ($permissions & ~$type) | /* There is what i don't know how to do */;
}

echo setPermission(2|4|16, 4|8,    false); // 2|16
echo setPermission(2|4|16, 4|8,    true ); // 2|4|8|16
echo setPermission(1|2|4,  4|8|16, false); // 1|2

通过分析问题,我发现如何执行函数的第一部分,当$valuetrue 时,第二部分必须等于$type,当$value 为@ 时,第二个必须等于0 987654329@,但我不知道如何以最简单的方式做到这一点。

请注意,参数 $type 可以是任何整数,而不仅仅是 2 的幂。

【问题讨论】:

  • 已编辑,在最后一段中我指出了不同之处
  • 凭借您的鬼才,您应该很容易理解每​​个位的操作独立于其他位...因此,无论您设置一个位还是多个位都没有区别。
  • 我觉得你说的不对。 $number = ($number & ~(1 << $n)) | ($new_bit << $n) 至少对我不起作用,因为当 $type 不是 2 的幂时,没有有效的 $n

标签: php binary bit-manipulation bitwise-operators


【解决方案1】:

您需要在setPermission 中执行不同的操作,具体取决于$value 是真还是假。您当前的代码仅实现了您要清除权限的情况 ($value = false)。

function setPermission(int $permissions, int $type, bool $value)
{
    if ($value)
        return $permissions | $type;
    else
        return $permissions & ~$type;
}

Demo on 3v4l.org

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 2016-04-01
    • 2014-01-14
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多