Переключите конкретное количество битов мест
c = bitshift(a, k)
c = bitshift(a, k)
возвращает значение a
переключенный k
биты. Вход fi
объект a
может быть скалярное значение или вектор и может быть любая фиксированная точка числовой тип. Выход fi
объект c
имеет тот же числовой тип как a
K
должно быть скалярное значение и MATLAB® встроенный числовой тип.
OverflowAction
свойство a
выполнен, но RoundingMethod
всегда Floor
. При повиновении RoundingMethod
свойство a
важно, попытайтесь использовать pow2
функция.
Когда действием переполнения является Saturate
знаковый бит всегда сохраняется. Знаковый бит также сохраняется, когда действием переполнения является Wrap
, и k
отрицательно. Когда действием переполнения является Wrap
и k
положительно, знаковый бит не сохраняется.
Когда k
положительно, 0-значные биты смещены в справа.
Когда k
отрицательно, и a
без знака, или и положительный fi
со знаком объект, 0-значные биты смещены в слева.
Когда k
отрицательно и a
и отрицательный fi
со знаком объект, 1-значные биты смещены в слева.
Этот пример подсвечивает как изменение OverflowAction
свойство fimath
объект может изменить результаты, возвращенные bitshift
функция. Считайте следующую фиксированную точку со знаком fi
объект со значением 3, размер слова 16, и дробная длина 0:
a = fi(3,1,16,0);
OverflowAction
fimath
свойством является Saturate
. Когда a
смещен таким образом, что это переполняется, это насыщается к максимальному возможному значению:for k=0:16,b=bitshift(a,k);... disp([num2str(k,'%02d'),'. ',bin(b)]);end 00. 0000000000000011 01. 0000000000000110 02. 0000000000001100 03. 0000000000011000 04. 0000000000110000 05. 0000000001100000 06. 0000000011000000 07. 0000000110000000 08. 0000001100000000 09. 0000011000000000 10. 0000110000000000 11. 0001100000000000 12. 0011000000000000 13. 0110000000000000 14. 0111111111111111 15. 0111111111111111 16. 0111111111111111
OverflowAction
к Wrap
. В этом случае старшие значащие биты откладывают “верхнюю часть” a
пока значение не является нулем:a = fi(3,1,16,0,'OverflowAction','Wrap'); for k=0:16,b=bitshift(a,k);... disp([num2str(k,'%02d'),'. ',bin(b)]);end 00. 0000000000000011 01. 0000000000000110 02. 0000000000001100 03. 0000000000011000 04. 0000000000110000 05. 0000000001100000 06. 0000000011000000 07. 0000000110000000 08. 0000001100000000 09. 0000011000000000 10. 0000110000000000 11. 0001100000000000 12. 0011000000000000 13. 0110000000000000 14. 1100000000000000 15. 1000000000000000 16. 0000000000000000