Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Логический сдвиг 
V
    Опции темы
pilotnet
Дата 11.8.2010, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.4.2008

Репутация: нет
Всего: нет



как реализовать логический сдвиг вправо на с/с++ ?
желательно через темплейт 

// Сдвиг вправо для отрицательного числа -21
-21 >>> 00 = 11111111111111111111111111101011 = -21
-21 >>> 01 = 01111111111111111111111111110101 = 2147483637
-21 >>> 02 = 00111111111111111111111111111010 = 1073741818
-21 >>> 03 = 00011111111111111111111111111101 = 536870909
-21 >>> 04 = 00001111111111111111111111111110 = 268435454
-21 >>> 05 = 00000111111111111111111111111111 = 134217727


Это сообщение отредактировал(а) pilotnet - 11.8.2010, 10:16
PM MAIL   Вверх
UniBomb
Дата 11.8.2010, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 97



А зачем что то реализовывать? Ведь есть же оператор ">>".

Код

-21 >> 0 // = 11111111111111111111111111101011 = -21
-21 >> 1 // = 01111111111111111111111111110101 = 2147483637
-21 >> 2 // = 00111111111111111111111111111010 = 1073741818
-21 >> 3 // = 00011111111111111111111111111101 = 536870909
-21 >> 4 // = 00001111111111111111111111111110 = 268435454
-21 >> 5 // = 00000111111111111111111111111111 = 134217727


Это сообщение отредактировал(а) UniBomb - 11.8.2010, 10:28
PM MAIL ICQ Skype   Вверх
pilotnet
Дата 11.8.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.4.2008

Репутация: нет
Всего: нет



оператор >> арифметический сдвиг

PM MAIL   Вверх
djamshud
Дата 11.8.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



pilotnet, что еще за арифметический? Двоичный сдвиг это. То, что вы и просите.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
UniBomb
Дата 11.8.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 97



хорошо, а если так:

Код

(-21>>1)&0x7FFFFFFF


тогда знаковый бит будет обнуляться.
PM MAIL ICQ Skype   Вверх
pilotnet
Дата 11.8.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.4.2008

Репутация: нет
Всего: нет



Цитата(djamshud @ 11.8.2010,  13:44)
pilotnet, что еще за арифметический? Двоичный сдвиг это. То, что вы и просите.

http://ru.wikipedia.org/wiki/Битовый_сдвиг
PM MAIL   Вверх
djamshud
Дата 11.8.2010, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



pilotnet, я хоть убей не вижу разницы между ним и тем, что вы написали.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
UniBomb
Дата 11.8.2010, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 97



В общем вот что получилось  smile 

Код

int LogicalShiftRight(int number, int bits)
{
    return bits==0?number:LogicalShiftRight(number>>1&0x7FFFFFFF, --bits);
}

//...
LogicalShiftRight(-21, 0); //-21
LogicalShiftRight(-21, 1); //2147483637
LogicalShiftRight(-21, 2); //1073741818


Правда нет проверки на количество сдвигаемых бит, но это лирика.
PM MAIL ICQ Skype   Вверх
pilotnet
Дата 11.8.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.4.2008

Репутация: нет
Всего: нет



Цитата(UniBomb @  11.8.2010,  14:15 Найти цитируемый пост)
В общем вот что получилось  

спасибо работает 
Вот что еще с темплейтами получилось
Код

template<class T> T ror(T val, unsigned int n)
{
        int bits = sizeof(T) * 8/*CHAR_BIT*/;
        n = n % bits;
        val = ( val >> n) | ( val << (bits - n) );
    
        int digit = 1;
        for (unsigned int i = 1; i < n; i++)
                digit = digit | (1 << i);
    
        return ( val & ~( digit << (bits - n) ) );
} 


PM MAIL   Вверх
Леопольд
Дата 11.8.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Код
namespace LogicalShift{

    template<typename> struct Unsigned;
    template<> struct Unsigned<char >{ typedef unsigned char  Type; };
    template<> struct Unsigned<short>{ typedef unsigned short Type; };
    template<> struct Unsigned<int  >{ typedef unsigned int   Type; };
    template<> struct Unsigned<long >{ typedef unsigned long  Type; };

    template<typename T>
    inline T right (T arg, std::size_t shift){
        typedef typename Unsigned<T>::Type U;
        return static_cast<T>((static_cast<U>(arg) >> shift));
    }

}

int main () {

    std::cout<<LogicalShift::right(-21, 1)<<"\n";
    std::cout<<LogicalShift::right(-21, 2)<<"\n";
    std::cout<<LogicalShift::right(-21, 3)<<"\n";
    std::cout<<LogicalShift::right(-21, 4)<<"\n";
    std::cout<<LogicalShift::right(-21, 5)<<std::endl;

    return 0;
}

Код
2147483637
1073741818
536870909
268435454
134217727

Итерация и, тем более, рекурсия здесь явно ни к чему. Компилятор может сделать это в статике. Результат - одна инструкция в исполняемом файле (без вызова функции)...


Это сообщение отредактировал(а) Леопольд - 11.8.2010, 12:10


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
pilotnet
Дата 11.8.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.4.2008

Репутация: нет
Всего: нет



Цитата(Леопольд @  11.8.2010,  14:56 Найти цитируемый пост)
Итерация и, тем более, рекурсия здесь явно ни к чему. Компилятор может сделать это в статике. Результат - одна инструкция в исполняемом файле (без вызова функции)...


Спасибо!! красиво  а главное быстро !!

Это сообщение отредактировал(а) pilotnet - 11.8.2010, 12:21
PM MAIL   Вверх
Леопольд
Дата 11.8.2010, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(pilotnet @  11.8.2010,  11:39 Найти цитируемый пост)
template<class T> T ror(T val, unsigned int n)
Код
namespace BitwiseShift{

    enum { byteSize = 8 };

    template<typename T> struct Unsigned {
        typedef T              Type;
    private:
        enum { simpleStaticAssert = T() >> 1 };
    };
    template<> struct Unsigned<char >    { typedef unsigned char  Type; };
    template<> struct Unsigned<short>    { typedef unsigned short Type; };
    template<> struct Unsigned<int  >    { typedef unsigned int   Type; };
    template<> struct Unsigned<long >    { typedef unsigned long  Type; };

    template<typename T>
    inline T lRight (T arg, std::size_t shift){
        typedef typename Unsigned<T>::Type U;
        return static_cast<T>((static_cast<U>(arg) >> shift));
    }

    template<typename T>
    inline T rRight (T arg, std::size_t shift){
        typedef typename Unsigned<T>::Type U;
        U temp = static_cast<U>(arg) >> shift;
        return static_cast<T>(temp | static_cast<U>(arg) << (sizeof(T) * byteSize - shift));
    }

    template<typename T>
    inline T rLeft (T arg, std::size_t shift){
        typedef typename Unsigned<T>::Type U;
        U temp = static_cast<U>(arg) << shift;
        return static_cast<T>(temp | static_cast<U>(arg) >> (sizeof(T) * byteSize - shift));
    }

}

int main () {

    std::cout<<BitwiseShift::lRight(-21, 1)<<"\n";
    std::cout<<BitwiseShift::lRight(-21, 2)<<"\n";
    std::cout<<BitwiseShift::lRight(-21, 3)<<"\n";
    std::cout<<BitwiseShift::lRight(-21, 4)<<"\n";
    std::cout<<BitwiseShift::lRight(-21, 5)<<"\n\n";

    std::cout<<BitwiseShift::rRight(static_cast<unsigned>(-1), 1)<<"\n";
    std::cout<<BitwiseShift::rLeft(-1, 1)<<std::endl;

    return 0;
}
Код
2147483637
1073741818
536870909
268435454
134217727

4294967295
-1
 smile 

Это сообщение отредактировал(а) Леопольд - 11.8.2010, 12:54


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.