Сдвинуть биты, указанное количество мест
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