如何在MATLAB中使用位集功能同时修改多个位

时间:2018-06-27 19:18:27

标签: matlab

>> 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

如何获得等于252的11111100?

4 个答案:

答案 0 :(得分:1)

两次应用bitset

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

申请顺序无关紧要。

或者,您可以使用bitset等同于应用正确的bitandbitorbitcmp操作序列的事实。

由于您有兴趣关闭多个位,因此可以

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

答案 1 :(得分:1)

这里是单线:

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

分开:

bits

使用给定的位计算整数。请注意,unique不得包含重复的元素。使用bits = unique(bits)来强制执行此操作:c = bitcmp(b,'uint32')

bitand(a,c)

计算以上内容的32位补码。与补码“与”运算会重置给定的位。

a = 112;
bits = [1,2];
bitor(a,sum(2.^(bits-1)))

计算输入数字与给定位关闭的整数的二进制与。

设置位更容易:

@property

答案 2 :(得分:1)

也许最明确,最容易理解,您可以将其转换为表示二进制的字符串,然后在其中进行操作,然后再转换回去。

a = 255
bin_a = flip(dec2bin(a))  % flip to make bigendian
bin_a([1, 2]) = '0'
a = bin2dec(flip(bin_a))

答案 3 :(得分:0)

这是一个基于@Mad Physicist的回答的小小的递归函数,该函数允许将数据中任意数量的位清零。感谢您提供原始信息。递归对于大多数人来说可能是显而易见的,但它可能会帮助某人。

function y = zero_nbits(x, n)

   y = bitset(x, n, 0)

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

end