Perl: проверка произвольного бита в битовой строке - PullRequest
0 голосов
/ 15 января 2012

Я пытаюсь проанализировать сходство узлов процессора + информацию о кеше в Linyx sysfs.

Я могу получить строку битов, например:

0000111100001111

Теперь мне нужна функция, в которой у меня есть десятичное число (например, 4 или 5), и мне нужно проверить, установлен ли n-й бит или нет. Таким образом, он вернул бы true для 4 и false для 5. Я мог бы создать строку, сдвигая 1 n раз, но я не уверен насчет синтаксиса, и есть ли более простой способ? Кроме того, нет ограничений на длину строки, поэтому я хочу избегать десятичных <-> двоичных преобразований.

Ответы [ 3 ]

5 голосов
/ 15 января 2012

Предполагая, что у вас есть строка битов "0000111100001111" в $str, если вы выполните шаг предварительного вычисления:

my $bit_vector = pack "b*", $str;

, вы можете затем использовать vec следующим образом:

$is_set = vec $bit_vector, $offset, 1;

, например, этот код

for (0..15) {
  print "$_\n" if vec $bit_vector, $_, 1;
}

будет выводить

4
5
6
7
12
13
14
15

Обратите внимание, что смещения основаны на нуле, поэтому, если вы хотите первый битчтобы быть битом 1, вы должны будете сами добавить / вычесть 1.

0 голосов
/ 15 января 2012

Более простой вариант без битового вектора, но наверняка вектор будет более эффективным способом решения проблемы.

sub is_bit_set
{
        my $bitstring = shift;
        my $bit = shift;
        return int substr($bitstring, -$bit, 1);
}
0 голосов
/ 15 января 2012

Ну, это похоже на работу, и я не собираюсь за эффективность:

sub is_bit_set
{
        my $bitstring = shift;
        my $bit = shift;

        my $index = length($bitstring) - $bit - 1;
        if (substr($bitstring, $index, 1) == "1") {
                return 1;
        }
        else {
                return 0;
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...