Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

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

04.12.2012, 01:53. Просмотров 2205. Ответов 16
Метки нет (Все метки)

В задании имеется ввиду последние 4 бита старшего разряда. Как мне кажется, нужно воспользоваться оператором сдвига. Но вот как выяснить на сколько нужно сдвигать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2012, 01:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использовать битове операций для обнуления всех бит, кроме последних четырёх (C++):

Запись последних восьми бит - C++
Добрый вечер! Подскажите, пожалуйста, как правильно записать 8-мь последних бит переменной типа int в переменную массива QByteArray,...

последовательность инструкций для обнуления трех старших бит регистра DH, без изменения остальных бит - Assembler
Напишите последовательность инструкций для обнуления трех старших бит регистра DH, без изменения остальных бит; результат сохраните в...

Залипают страницы всех браузеров последних версий, кроме Explorer и Opera 12.17 - Windows 7
У всех браузеров: chrome, yandex, safari, opera и т.д. картинка как бы зависает, и спасает только то, когда окно браузера я сворачиваю и...

Составить число из бит четырёх данных чисел (MASM32) - Assembler
3 Даны четыре числа в двоичном виде. Составить пятое число, которое состоит из 0-го и 1-го битов первого числа, 2-го и 3-го битов второго...

Стоит ли использовать 2 потока для асинхронного выполнения двух независимых операций - C#
доброго всем времени суток. помогите разобраться: у меня проект C# FormApplication в нем есть 2 формы Form1 и Form2, на Form2 есть...

Обнуления всех положительных элементов в одномерном массиве. Java - Java
Помогите пожалуйста составить программу на java. Не выходит у меня что то с этими массивами никак. буду очень признателен! Составить...

16
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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 не обязательно имеет столько битов, сколько битов в чарах, но с высокой долей вероятности это так.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 12:30  [ТС] #3
Допустим, имеем беззнаковое целочисленное значение которое равно 307. Оно имеет битовую структуру 100110011. После обнуления 4-х битов старшего разряда, должно получиться 10011, т.е. число 19.
0
Croessmah
Пришел
Эксперт CЭксперт С++
13759 / 7840 / 893
Регистрация: 27.09.2012
Сообщений: 19,254
Записей в блоге: 3
Завершенные тесты: 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;
}
0
xtorne21st
интересующийся
304 / 275 / 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; }
Спасибо, но вы обнулили биты начиная с младшего разряда, а нужно начиная со старшего...
0
Croessmah
Пришел
Эксперт CЭксперт С++
13759 / 7840 / 893
Регистрация: 27.09.2012
Сообщений: 19,254
Записей в блоге: 3
Завершенные тесты: 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;
}
смотря что Вам нужно.
0
Kastaneda
Jesus loves me
Эксперт С++
4729 / 2933 / 242
Регистрация: 12.12.2009
Сообщений: 7,442
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 13:11 #7
Цитата Сообщение от xtorne21st Посмотреть сообщение
4 бита старшего разряда
Говоря о бинарной системе счисления, разряд == бит. Похоже имелся ввиду старший байт.
0
Croessmah
04.12.2012, 13:16
  #8

Не по теме:

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

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

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

Добавлено через 50 секунд
Между прочим говоря задание - из учебника, так что должно присутствовать решение.
0
Croessmah
Пришел
Эксперт CЭксперт С++
13759 / 7840 / 893
Регистрация: 27.09.2012
Сообщений: 19,254
Записей в блоге: 3
Завершенные тесты: 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;
}
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 14:32  [ТС] #11
Цитата Сообщение от Croessmah Посмотреть сообщение
while(temp) {temp/=2;++count;}
Фича с подсчётом количества битов это куто)

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

Это код просто для примера.
0
Croessmah
Пришел
Эксперт CЭксперт С++
13759 / 7840 / 893
Регистрация: 27.09.2012
Сообщений: 19,254
Записей в блоге: 3
Завершенные тесты: 1
04.12.2012, 14:34 #12
Цитата Сообщение от xtorne21st Посмотреть сообщение
Да и рекурсивная функция - простая и удобная. В общем, спасибо
она не работает, если передать её 0.
Цитата Сообщение от xtorne21st Посмотреть сообщение
Фича с подсчётом количества битов это куто)
будет работать только для чисел больше 15(если не ошибаюсь)


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

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
будет работать только для чисел больше 15(если не ошибаюсь)
у меня size_t - 4 байта, вот только не знаю может оно иметь отрицательное значение... если да - то до 15 предел (на моей машине)...
0
Croessmah
Пришел
Эксперт CЭксперт С++
13759 / 7840 / 893
Регистрация: 27.09.2012
Сообщений: 19,254
Записей в блоге: 3
Завершенные тесты: 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(число,сколько_бит_обнулить)
1
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 16:39  [ТС] #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Я имел ввиду, если num<16, то не работает.
Что-то на ум ничего путного не лезет, но вот еще один вариант. Работает вроде правильно.
Интересно, у меня ваша "старая" рекурсивная функция прекрасно работает (проверял на нескольких значениях и сверялся с калькулятором...)
0
04.12.2012, 16:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 16:39
Привет! Вот еще темы с ответами:

Составить процедуру обнуления всех положительных элементов массива - Pascal ABC
Составить процедуру обнуления всех положительных элементов в одномерном массиве A. С помощью этой процедуры обнулить все положительные...

Какой тип (int или byte) использовать для операций с большими массивами - C#
Всем здравствуйте. Есть 2 массива. Массивы неизвестной, очень большой длинны. Я в циклах перемножаю эти массивы. Для сохранения результатов...

Составить процедуру обнуления всех отрицательных элементов в одномерном массиве - Turbo Pascal
Составить процедуру обнуления всех отрицательных элементов в одномерном массиве А . С помощью этой процедуры обнулить все отрицательные...

Сделать для всех текстов 12рх, кроме h1.h6 - HTML, CSS
Сделал в начале * {font-size: 12px;}, но это ведь влияет на h1..h6. Подскажите что-нибудь, кроме javascript'а (так как я закинул в html/css...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru