Как использовать функцию набора битов в MATLAB для одновременного изменения нескольких бит - PullRequest
0 голосов
/ 27 июня 2018
>> a = 255

a =

   255

>> bitset(a,1,0)

ans =

   254

здесь первый бит установлен в 0, поэтому мы получаем 11111110, эквивалентный 254

>> bitset(a,[1,2],0)

ans =

   254   253

здесь 1-й и 2-й бит устанавливаются на 0 отдельно. Отсюда получаем 11111110 эквивалентно 254 11111101 эквивалентно 253

как получить 11111100 эквивалент 252?

Ответы [ 4 ]

0 голосов
/ 17 мая 2019

Вот небольшая рекурсивная функция, основанная на ответе @Mad Physicist, которая позволит обнулять любое количество битов в данных. Спасибо за оригинальную информацию. Вероятно, рекурсия очевидна для большинства людей, но может помочь кому-то.

function y = zero_nbits(x, n)

   y = bitset(x, n, 0)

   if n > 1
      y = zero_nbits(y, n-1);
   end

end
0 голосов
/ 28 июня 2018

Вот одна строка:

a = 255;
bits = [1,2];
bitand(a,bitcmp(sum(2.^(bits-1)),'uint32'))

Разобрать:

b = sum(2.^(bits-1))

вычисляет целое число с заданным набором битов. Обратите внимание, что bits не должно содержать повторяющихся элементов. Используйте unique для обеспечения этого: bits = unique(bits).

c = bitcmp(b,'uint32')

вычисляет 32-битное дополнение вышеупомянутого. ANDing с дополнением сбрасывает данные биты.

bitand(a,c)

вычисляет двоичное И для входного числа и целое число с выключенными заданными битами.

Установка битов проще:

a = 112;
bits = [1,2];
bitor(a,sum(2.^(bits-1)))
0 голосов
/ 28 июня 2018

Может быть, наиболее явный, самый простой для понимания, вы можете преобразовать в строку, представляющую двоичный файл, а затем выполнить там операции, а затем преобразовать обратно.

a = 255
bin_a = flip(dec2bin(a))  % flip to make bigendian
bin_a([1, 2]) = '0'
a = bin2dec(flip(bin_a))
0 голосов
/ 27 июня 2018

Применить bitset дважды:

bitset(bitset(a, 1, 0), 2, 0)

Порядок подачи заявок не имеет значения.

В качестве альтернативы вы можете использовать тот факт, что bitset является эквивалентом применения правильной последовательности bitand, bitor и bitcmp операций.

Поскольку вы заинтересованы в отключении нескольких битов, вы можете сделать

bitand(bitset(a, 1, 0), bitset(a, 2, 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...