Заданное количество мест в битах сдвига
c = bitshift(a, k)
c = bitshift(a, k)
возвращает значение a
сдвинуто на k
биты. Область входа fi
a объекта
может быть скалярным значением или вектором и может быть любым числовым типом с фиксированной точкой. Область выхода fi
c объекта
имеет тот же числовой тип, что и a
. k
должно быть скалярным значением и MATLAB® встроенный числовой тип.
The 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