将指定位更改为 0

Ric*_*k S 3 perl bitwise-operators

我有一个号码:

11100111

我想要一个操作将我选择的特定位更改为 0。

所以,如果我希望它是:

10100111

对于第七位,我将使用什么操作,例如:

$x = 6;
$y = "11100111";
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

$z = $y & $x
Run Code Online (Sandbox Code Playgroud)

但是,我知道这是错误的。我知道我可以从该值中减去 2^$x,但这看起来不太优雅。

小智 9

我认为您使用字符串的方式是错误的。我们应该使用整数。我们可以这样把数字写成整数:

0b11100111
Run Code Online (Sandbox Code Playgroud)

我们可以创建一个仅设置了第 7 位的数字,如下所示:

1 << 6
Run Code Online (Sandbox Code Playgroud)

我们可以创建一个数字,其中设置了除第 7 位之外的所有位:

~(1 << 6)
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,我们可以将第 7 位设置为零:

my $x = 6;
my $y = 0b11100111;
my $z = $y & ~(1 << $x);
print "$z\n"
Run Code Online (Sandbox Code Playgroud)

这会输出二进制167的十进制。10100111如果我们想输出数字的二进制表示,我们可以使用printf

printf "%b\n", $z;
Run Code Online (Sandbox Code Playgroud)

这输出10100111.