我有一個號碼:
11100111
我想要一個將我選擇的特定位更改為 0 的操作。
所以,如果我希望它是:
10100111
對于第 7 位,我將使用什么操作,例如:
$x = 6;
$y = "11100111";
它看起來像:
$z = $y & $x
但是,我知道這是錯誤的。我知道我可以從值中減去 2^$x,但這似乎不雅。
uj5u.com熱心網友回復:
我認為您使用字串是錯誤的方法。我們應該改用整數。我們可以這樣寫數字為整數:
0b11100111
我們可以創建一個數字,它只設定了第 7 位,這樣:
1 << 6
我們可以創建一個數字,它設定了所有位,除了第 7 位:
~(1 << 6)
考慮到這一點,我們可以將第 7 位設定為零:
my $x = 6;
my $y = 0b11100111;
my $z = $y & ~(1 << $x);
print "$z\n"
此輸出小數167是10100111二進制。如果我們想輸出數字的二進制表示,我們可以使用printf:
printf "%b\n", $z;
這輸出10100111.
uj5u.com熱心網友回復:
由于您的二進制數實際上是一個字串,您可以使用substr簡單地將 1 替換為 0:
use warnings;
use strict;
my $x = 6;
my $y = '11100111';
print "$y\n";
substr($y, (7 - $x), 1) = '0';
print "$y\n";
印刷:
11100111
10100111
uj5u.com熱心網友回復:
我的Bit::Manip發行版就是做這種事情的。
use strict;
use warnings;
use Bit::Manip qw(:all);
my $num = 0b11100111;
my $bit_position = 6;
my $flipped = bit_off($num, $bit_position);
printf("orig: %b\n", $num);
printf("flipped: %b\n", $flipped);
輸出:
orig: 11100111
flipped: 10100111
有關庫可以按位執行的所有操作,請參閱檔案。
uj5u.com熱心網友回復:
您還可以使用vec來操作這些位:
my $v = pack "B8", "11100111"; # Convert one-byte bitstring into a vector
printf "%vb\n", $v;
vec($v, 6, 1) = 0; # Set the sixth bit
printf "%vb\n", $v;
my $s = unpack "B8", $v; # Back to a string of 1's and 0's
# prints:
# 11100111
# 10100111
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/394522.html
上一篇:決議正則運算式字串的正則運算式
