Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
1

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

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

Author24 — интернет-сервис помощи студентам
В задании имеется ввиду последние 4 бита старшего разряда. Как мне кажется, нужно воспользоваться оператором сдвига. Но вот как выяснить на сколько нужно сдвигать...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2012, 01:53
Ответы с готовыми решениями:

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

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

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

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

16
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 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
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 12:30  [ТС] 3
Допустим, имеем беззнаковое целочисленное значение которое равно 307. Оно имеет битовую структуру 100110011. После обнуления 4-х битов старшего разряда, должно получиться 10011, т.е. число 19.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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
интересующийся
311 / 282 / 93
Регистрация: 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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,135
Записей в блоге: 2
04.12.2012, 13:11 7
Цитата Сообщение от xtorne21st Посмотреть сообщение
4 бита старшего разряда
Говоря о бинарной системе счисления, разряд == бит. Похоже имелся ввиду старший байт.
0
Croessmah
04.12.2012, 13:16
  #8

Не по теме:

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

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

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

Добавлено через 50 секунд
Между прочим говоря задание - из учебника, так что должно присутствовать решение.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 14:32  [ТС] 11
Цитата Сообщение от Croessmah Посмотреть сообщение
while(temp) {temp/=2;++count;}
Фича с подсчётом количества битов это куто)

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

Это код просто для примера.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
04.12.2012, 14:34 12
Цитата Сообщение от xtorne21st Посмотреть сообщение
Да и рекурсивная функция - простая и удобная. В общем, спасибо
она не работает, если передать её 0.
Цитата Сообщение от xtorne21st Посмотреть сообщение
Фича с подсчётом количества битов это куто)
будет работать только для чисел больше 15(если не ошибаюсь)


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

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
будет работать только для чисел больше 15(если не ошибаюсь)
у меня size_t - 4 байта, вот только не знаю может оно иметь отрицательное значение... если да - то до 15 предел (на моей машине)...
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 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
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 16:39  [ТС] 15
Цитата Сообщение от Croessmah Посмотреть сообщение
Я имел ввиду, если num<16, то не работает.
Что-то на ум ничего путного не лезет, но вот еще один вариант. Работает вроде правильно.
Интересно, у меня ваша "старая" рекурсивная функция прекрасно работает (проверял на нескольких значениях и сверялся с калькулятором...)
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
04.12.2012, 16:43 16
Цитата Сообщение от xtorne21st Посмотреть сообщение
Интересно, у меня ваша "старая" рекурсивная функция прекрасно работает (проверял на нескольких значениях и сверялся с калькулятором...)
Она ничего не выводит, если ей передать 0 в качестве параметра.
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
04.12.2012, 16:45  [ТС] 17
проверил ещё раз со значениями 1,2,3, 24, 34567775 - всё верно

Добавлено через 1 минуту
ну да с 0 не работает, я просто его не использовал
0
04.12.2012, 16:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2012, 16:45
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru