Так что я пытался сделать «зацикливание» побитового сдвига в C++ (11), и я получил основной код к этому:Как изменить TYPENAME, подписанную-Несс в функции шаблона C++
#include <cstdio>
#include <limits> // is_signed
#include <limits.h> // CHAR_BIT
template<typename T>
T rotl(T input, unsigned int shift)
{
return (input<<shift)|(input>>(sizeof(T)*CHAR_BIT-shift));
}
template<typename T>
T rotr(T input, unsigned int shift)
{
return (input>>shift)|(input<<(sizeof(T)*CHAR_BIT-shift));
}
int main()
{
int i = -5;
std::printf("%i\n", i);
i = rotl(i, 4); // or other value
std::printf("%i\n", i);
i = rotr(i, 4); // same value as above
std::printf("%i\n", i);
}
Это дает мне ожидаемое поведение, когда выход будет выглядеть следующим образом:
-5
-1
-1
Поскольку ИНТ я подписан, однако, если я делаю это в коде:
i = (int)rotl((unsigned int)i, 4);
. . .
i = (int)rotr((unsigned int)i, 4);
Выход становится:
-5
-65
-5
, который работает, как я хочу его тоже. Я могу также проверить, подписанную-ность Т, используя numeric_limits
следующим образом:
T rotr(T input, unsigned int shift)
{
if(std::numeric_limits<T>::is_signed == false){
return()
}else{
return // problem here
}
}
Но я не могу показаться, чтобы выяснить, как повернуть вокруг подписанного Несс Т, (unsigned T)
недопустим для typenames. Так как же я буду делать это? Я бы предпочел не использовать ничего, кроме стандартных библиотек (личный вкус действительно), но если нет правдоподобного способа сделать это, я мог бы рассмотреть варианты без std.
Спасибо, ожидание было из-за пьянства (до сих пор пьян ТБХ), работал безупречно, что мне нужно. Спасибо всем, что внесли свой вклад. – MetroidChild
@MetroChild. Не беспокойся. Был там. :-) –