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

Использовать битове операций для обнуления всех бит, кроме последних четырёх - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 01:53     Использовать битове операций для обнуления всех бит, кроме последних четырёх #1
В задании имеется ввиду последние 4 бита старшего разряда. Как мне кажется, нужно воспользоваться оператором сдвига. Но вот как выяснить на сколько нужно сдвигать...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2012, 01:53     Использовать битове операций для обнуления всех бит, кроме последних четырёх
Посмотрите здесь:

C++ Не используя никаких операций, кроме умножения и присваивания, составить программу, вычисляющую a7 за 4 операции умножения
Не пользуясь никакими другими арифметическими операциями, кроме умножения, сложения и вычитания, вычислить за минимальное число операций C++
Программа не работает на всех компах кроме моего C++
отнять последний столбец из всех кроме последнего C++
C++ Не пользуясь никакими арифметическими операциями, кроме умножения, получить: a4, a12 и a28 за шесть операций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
04.12.2012, 03:38     Использовать битове операций для обнуления всех бит, кроме последних четырёх #2
Хинт:
C++
1
2
3
4
#include <climits>
 
CHAR_BIT // = количество битов в одном char
sizeof(int) // = размер int в чарах
По стандарту, правда, int не обязательно имеет столько битов, сколько битов в чарах, но с высокой долей вероятности это так.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 12:30  [ТС]     Использовать битове операций для обнуления всех бит, кроме последних четырёх #3
Допустим, имеем беззнаковое целочисленное значение которое равно 307. Оно имеет битовую структуру 100110011. После обнуления 4-х битов старшего разряда, должно получиться 10011, т.е. число 19.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 12:50     Использовать битове операций для обнуления всех бит, кроме последних четырёх #4
Цитата Сообщение от xtorne21st Посмотреть сообщение
В задании имеется ввиду последние 4 бита старшего разряда.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
void ShowBinary(int num){
    size_t NUM_BITS=sizeof(num)*8;
    for(int i=NUM_BITS-1;i>=0;--i)
        std::cout<<((num & (1<<i))?'1':'0');
}
int foo(int num){
    size_t NUM_BITS=sizeof(num)*8;
    return (num & 0xF<<NUM_BITS-4);
}
int main()
{
    int x=-3454354353;
    ShowBinary(x);
    std::cout<<std::endl;
    ShowBinary(foo(x));
    std::cin.get();
    return 0;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 13:00  [ТС]     Использовать битове операций для обнуления всех бит, кроме последних четырёх #5
Цитата Сообщение от Croessmah Посмотреть сообщение
#include <iostream> void ShowBinary(int num){ size_t NUM_BITS=sizeof(num)*8; for(int i=NUM_BITS-1;i>=0;--i) std::cout<<((num & (1<<i))?'1':'0'); } int foo(int num){ size_t NUM_BITS=sizeof(num)*8; return (num & 0xF<<NUM_BITS-4); } int main() { int x=-3454354353; ShowBinary(x); std::cout<<std::endl; ShowBinary(foo(x)); std::cin.get(); return 0; }
Спасибо, но вы обнулили биты начиная с младшего разряда, а нужно начиная со старшего...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 13:08     Использовать битове операций для обнуления всех бит, кроме последних четырёх #6
Цитата Сообщение от xtorne21st Посмотреть сообщение
Спасибо, но вы обнулили биты начиная с младшего разряда, а нужно начиная со старшего...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
void ShowBinary(int num){
    size_t NUM_BITS=sizeof(num)*8;
    for(int i=NUM_BITS-1;i>=0;--i)
        std::cout<<((num & (1<<i))?'1':'0');
}
int foo(int num){
    size_t NUM_BITS=(sizeof(num)-1)*8;
    return (num & 0xF<<NUM_BITS);
}
 
 
int main()
{
    int x=-1;
    ShowBinary(x);
    std::cout<<std::endl;
    ShowBinary(foo(x));
    std::cin.get();
    return 0;
}
Добавлено через 1 минуту
ну или вот:
C++
1
2
3
int foo(int num){
    return num & 0xF;
}
смотря что Вам нужно.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.12.2012, 13:11     Использовать битове операций для обнуления всех бит, кроме последних четырёх #7
Цитата Сообщение от xtorne21st Посмотреть сообщение
4 бита старшего разряда
Говоря о бинарной системе счисления, разряд == бит. Похоже имелся ввиду старший байт.
Croessmah
04.12.2012, 13:16
  #8

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
Говоря о бинарной системе счисления, разряд == бит. Похоже имелся ввиду старший байт.
Да я вот тоже не пойму, что конкретно надо сделать

xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 13:36  [ТС]     Использовать битове операций для обнуления всех бит, кроме последних четырёх #9
Возможно я не правильно выразился, но как я уже говорил, есть число 307 его битовая структура 100110011, нужно обнулить первые биты начиная с самого старшего, положительно заряженного, т.е. в результате должно получиться 000010011 т.е. число 19.

Добавлено через 6 минут
И сделать это исключительно при помощи битовых операций. Если бы нужно было обнулить четыре бита начиная с самого младшего, то это сделать достаточно просто: a &= a << 4;

Добавлено через 50 секунд
Между прочим говоря задание - из учебника, так что должно присутствовать решение.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 13:56     Использовать битове операций для обнуления всех бит, кроме последних четырёх #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
void ShowBinary(size_t num){
    if(!num) return;
    ShowBinary(num/2);
    std::cout<<num%2;
}
 
int foo(int num){
    int count=0;
    int temp=num;
    while(temp) {temp/=2;++count;}
    return (num & ~(0xF<<(count-4)));
}
 
 
int main()
{
    int x=309;
    ShowBinary(x);
    std::cout<<std::endl;
    x=foo(x);
    ShowBinary(x);
    std::cin.get();
    return 0;
}
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 14:32  [ТС]     Использовать битове операций для обнуления всех бит, кроме последних четырёх #11
Цитата Сообщение от Croessmah Посмотреть сообщение
while(temp) {temp/=2;++count;}
Фича с подсчётом количества битов это куто)

Добавлено через 17 минут
Да и рекурсивная функция - простая и удобная. В общем, спасибо

Это код просто для примера.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 14:34     Использовать битове операций для обнуления всех бит, кроме последних четырёх #12
Цитата Сообщение от xtorne21st Посмотреть сообщение
Да и рекурсивная функция - простая и удобная. В общем, спасибо
она не работает, если передать её 0.
Цитата Сообщение от xtorne21st Посмотреть сообщение
Фича с подсчётом количества битов это куто)
будет работать только для чисел больше 15(если не ошибаюсь)


Этот код - просто для примера.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 14:40  [ТС]     Использовать битове операций для обнуления всех бит, кроме последних четырёх #13
Ну и наконец, спасибо, что проявили терпение и выдержку и за то, что дошли "до конца".

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
будет работать только для чисел больше 15(если не ошибаюсь)
у меня size_t - 4 байта, вот только не знаю может оно иметь отрицательное значение... если да - то до 15 предел (на моей машине)...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 15:27     Использовать битове операций для обнуления всех бит, кроме последних четырёх #14
Цитата Сообщение от xtorne21st Посмотреть сообщение
у меня size_t - 4 байта, вот только не знаю может оно иметь отрицательное значение... если да - то до 15 предел (на моей машине)...
Я имел ввиду, если num<16, то не работает.
Что-то на ум ничего путного не лезет, но вот еще один вариант. Работает вроде правильно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
void ShowBinary(size_t num, bool f=false){
    if(!num) {
        if(!f)
            std::cout<<'0';
        return;
    }
    ShowBinary(num/2,true);
    std::cout<<num%2;
}
 
int foo(size_t num, size_t s){
    if(num<(1<<s)) return 0;
    int count=0;
    size_t temp=num;
    while(temp) {temp>>=1;++count;}
    temp=sizeof(num) * 8 - count + s;
    return ((num<<temp)>>temp);
}
 
 
int main()
{
    int x=67;
    ShowBinary(x);
    std::cout<<std::endl;
    x=foo(x,4);
    ShowBinary(x);
    std::cout<<std::endl;
    std::cin.get();
    return 0;
}
Функция foo(число,сколько_бит_обнулить)
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 16:39  [ТС]     Использовать битове операций для обнуления всех бит, кроме последних четырёх #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Я имел ввиду, если num<16, то не работает.
Что-то на ум ничего путного не лезет, но вот еще один вариант. Работает вроде правильно.
Интересно, у меня ваша "старая" рекурсивная функция прекрасно работает (проверял на нескольких значениях и сверялся с калькулятором...)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 16:43     Использовать битове операций для обнуления всех бит, кроме последних четырёх #16
Цитата Сообщение от xtorne21st Посмотреть сообщение
Интересно, у меня ваша "старая" рекурсивная функция прекрасно работает (проверял на нескольких значениях и сверялся с калькулятором...)
Она ничего не выводит, если ей передать 0 в качестве параметра.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 16:45     Использовать битове операций для обнуления всех бит, кроме последних четырёх
Еще ссылки по теме:

Не пользуясь никакими другими арифметическими операциями, кроме умножения, получить А в 21 степени, за шесть операций. C++
Запись последних восьми бит C++
Отсеять всех людей, кроме 4 рандомных C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 16:45  [ТС]     Использовать битове операций для обнуления всех бит, кроме последних четырёх #17
проверил ещё раз со значениями 1,2,3, 24, 34567775 - всё верно

Добавлено через 1 минуту
ну да с 0 не работает, я просто его не использовал
Yandex
Объявления
04.12.2012, 16:45     Использовать битове операций для обнуления всех бит, кроме последних четырёх
Ответ Создать тему
Опции темы

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