Форум программистов, компьютерный форум CyberForum.ru

Логический сдвиг влево - C++

Восстановить пароль Регистрация
 
broDiaga_cpp
 Аватар для broDiaga_cpp
19 / 9 / 1
Регистрация: 20.02.2010
Сообщений: 180
31.07.2013, 14:40     Логический сдвиг влево #1
C++
1
2
3
4
5
6
7
8
9
10
11
unsigned __int64 number = 239176053778592;
    ClongNumber c(number);
    c.print();
 
    for(int i = 0; i < 18; i++)
    {
        unsigned __int64 number_new = number << i;
        ClongNumber c_new1(number_new);
        std::cout << "i " << i << std::endl;
        c_new1.print();
    }
Логический сдвиг влево

Почему при i = 16 начинает чушь выдавать??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2013, 14:40     Логический сдвиг влево
Посмотрите здесь:

C++ Сдвиг символа влево
C++ Циклический сдвиг в матрице в влево
C++ Циклический сдвиг массива влево
Сдвиг влево C++
Многократный сдвиг массива влево C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
broDiaga_cpp
 Аватар для broDiaga_cpp
19 / 9 / 1
Регистрация: 20.02.2010
Сообщений: 180
31.07.2013, 14:50  [ТС]     Логический сдвиг влево #2
Он вроде инвертируется, а потом добавляет единицу, но ведь он должен просто логически сдвинуть биты и всё. Это же беззнаковое целое!
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.07.2013, 14:54     Логический сдвиг влево #3
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Логический сдвиг
это что-то новенькое. Судя по названию, результат должен быть булевым числом

Добавлено через 1 минуту
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Почему при i = 16 начинает чушь выдавать??
Это уже вопрос к Вашему
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
c_new1.print();
broDiaga_cpp
 Аватар для broDiaga_cpp
19 / 9 / 1
Регистрация: 20.02.2010
Сообщений: 180
31.07.2013, 15:03  [ТС]     Логический сдвиг влево #4
Функция print() выдаёт всё верно. Она выводит все 64 разряда числа.

Добавлено через 6 минут
Проблема решена. Ошибка была в конструкторе класса ClongNumber.
Когда разбивал на степени - брал абсолютное значение числа.
Соответственно, когда старший бит заполнялся единицей - он игнорировался.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.07.2013, 15:08     Логический сдвиг влево #5
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Функция print() выдаёт всё верно.
Если так уверены, то попробуйте вывести двоичное представление числа через std::bitset скажем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <bitset>
 
int main() {
    
    
    const unsigned long long value = 239176053778592ULL;
    
    std::bitset<64> bs(value);
    std::cout << bs << std::endl;
    std::cout << (bs << 16) << std::endl;
    return 0;
}
https://ideone.com/9ajA0c

Добавлено через 42 секунды
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Проблема решена. Ошибка была в конструкторе класса ClongNumber.
Вот и славно
Yandex
Объявления
31.07.2013, 15:08     Логический сдвиг влево
Ответ Создать тему
Опции темы

Текущее время: 03:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru