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

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

Войти
Регистрация
Восстановить пароль
 
 
RAFA91
Заблокирован
#1

Операции с битами данных - C++

17.06.2015, 15:09. Просмотров 868. Ответов 39
Метки нет (Все метки)

Всем доброго дня !

Подскажите пожалуйста как произвести побитовое И ?

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
#include <iostream>
#include <conio.h>
 
 
using namespace std;
 
 
int main()
 
{
    unsigned short  x = 65535;
 
    unsigned short  y = 65535;
 
    unsigned short  z;
 
    x & y;
 
    cout<<"\n****** "<<sizeof(x)<<" "<<x<<" "<<y<<"\n";
 
    getch();
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2015, 15:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Операции с битами данных (C++):

Операции с битами в c++ - C++
Помогите начинающему. Объясните пожалуйста как работает данная функция void show_memory(unsigned char *a, int size) { for (int i =...

Операции с битами - C++
Напишите программу, которая принимает с клавиатуры целое число типа int и подсчитывает в нем количество битов, равных 1. Но...

Объединение. Операции с битами - C++
Напишите программу, которая вычисляет произведение любого целого без знака числа на выражение 2 n . Программа должна предоставлять...

операции для работы с битами - C++
Есть ли в Visual C++ операторы выполняющие операции для работы с битами(сдвиг влево, сдвиг вправо, поразрядная инверсия, поразрядное ИЛИ,...

Битовые операции с разными типа данных - C++
Здравствуйте. В голове возник такой странный вопрос, а мб и не странный. Возможны ли битовые операции с разными типа данных, например int...

Класс «Дата» - поля данных и перегруженные операции - C++
Привет! ребят помогите с заданием:&quot; Класс «Дата» должен включать поля данных: день, месяц, год; методы: вывод даты и времени года и...

39
IceCortez
25 / 25 / 19
Регистрация: 25.03.2014
Сообщений: 233
17.06.2015, 15:23 #2
C++
1
&
Не знаю, что вы хотели сделать в коде, но похоже, что надо
C++
1
x &= y;
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
17.06.2015, 15:29 #3
а результат куда девается-то, блин?
ты с арифметическими операциями так же программы что ли пишешь?
C++
1
2
3
4
5
    unsigned short  x = 65535; 
    unsigned short  y = 65535; 
    unsigned short  z; 
    x + y; 
    cout<<"\n****** "<<sizeof(x)<<" "<<x<<" "<<y<<"\n";
может всё-таки лучше
C++
1
2
3
4
5
    unsigned short  x = 65535; 
    unsigned short  y = 65535; 
    unsigned short  z; 
    z = x & y; 
    cout<<"\n****** "<<sizeof(x)<<" "<<x<<" "<<y<<" "<<z<<"\n";
0
Croessmah
17.06.2015, 15:58
  #4

Не по теме:

Я вот заметил, что там, где требуется работа с битами, всегда присутствует Kuzia domovenok. Видимо, любит он это дело

0
RAFA91
Заблокирован
17.06.2015, 16:20  [ТС] #5
написал такой код.

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
33
34
35
36
37
38
39
40
#include <iostream>
#include <conio.h>
 
 
using namespace std;
 
 
int main()
 
{
    unsigned short  x = 0;
 
    unsigned short  y = 0;
 
    unsigned short  z = 0;
 
    cout<<"\n";
 
    for(;x<50000;x=x+1000)
 
    {
        for(unsigned short i=0,y = 1;i<16;i++,y=y*2)
 
    {
        z = x & y;
        
        if(z == y) cout<<"1 ";
 
        else cout<<"0 ";
    }
 
        cout<<"\n\n";
    }
 
    
 
    getch();
 
    return 0;
}
на экран получаю числа от 1000 до 50000 в двоичном исполнении.

в переменную y сначала гружу 1 потом 2 4 8 и тд

далее делаю логику z = x & y; с целью проверки установки 0-го 1-го 2-го и тд. бита.

тоесть
C++
1
    if(z == y) cout<<"1 ";
_____________________________________

скажите пожалуйста есть ли какая-то функция которая может проверить бит к примеру следуюшим образом :

мы тупо указываем номер бита , а она нам возвращает TRUE или FALSE ?
0
Croessmah
Эксперт CЭксперт С++
13514 / 7673 / 866
Регистрация: 27.09.2012
Сообщений: 18,891
Записей в блоге: 3
Завершенные тесты: 1
17.06.2015, 16:28 #6
C++
1
2
3
4
5
template < typename T >
inline bool get_bit ( const T & number , unsigned short index )
{
    return (1<<index)&number ;
}
0
RAFA91
Заблокирован
19.06.2015, 13:58  [ТС] #7
Всем большое спасибо за советы !

Решил написать свои функции для работы с битами.

C++
1
2
3
4
5
bool Check_Bit(unsigned short,int); //проверка бита
 
void Bit_Set(unsigned short &,int); //установка бита
 
void Reset_Bit(unsigned short &,int);//сброс бита
но они у меня плохо работают. подскажите пожалуйста в чем ошибка ?

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <conio.h>
 
 
using namespace std;
 
bool Check_Bit(unsigned short,int);
 
void Bit_Set(unsigned short &,int);
 
void Reset_Bit(unsigned short &,int);
 
int main()
 
{
    unsigned short x = 255;
 
    for(int i = 0; i < 16; i++)
 
    {
        if (Check_Bit(x,i)) cout << "\nBit "<< i << " - 1\n";
        
        else cout << "\nBit "<< i << " - 0\n";
 
    }
 
    cout << "\n***********************\n";
 
    Bit_Set(x,15);
 
    for(i = 0; i < 16; i++)
 
    {
        if (Check_Bit(x,i)) cout << "\nBit "<< i << " - 1\n";
        
        else cout << "\nBit "<< i << " - 0\n";
 
    }
 
    cout << "\n++++++++++++++++++++++++++++\n";
 
    Reset_Bit(x,0);
 
    for(i = 0; i < 16; i++)
 
    {
        if (Check_Bit(x,i)) cout << "\nBit "<< i << " - 1\n";
        
        else cout << "\nBit "<< i << " - 0\n";
 
    }
    
    getch();
 
    return 0;
}
 
 
bool Check_Bit(unsigned short x, int n)
 
{
    unsigned short k = 1;
 
    for(int i = 0; i < n; i++)
        
    k *= 2;
    
    x = x & k;
    
    return (x == k) ? true : false;
}
 
void Bit_Set(unsigned short &x, int n)
 
{
    unsigned short k = 1;
 
    for(int i = 0; i < n; i++)
        
    k *= 2;
 
    x = x | k;
}
 
void Reset_Bit(unsigned short &x, int n)
 
{
    unsigned short k = 1;
    
    for(int i = 0; i < n; i++)
        
    k *= 2;
 
    k = ~k;
 
    x = x & k;
}
0
XZentus
201 / 199 / 41
Регистрация: 06.10.2013
Сообщений: 552
19.06.2015, 14:12 #8
RAFA91, Check_bit смотрите постом выше, там хороший код. И исходя из него лучше переделать свои функции. А то ваши велосипеды не особо удачные...

Добавлено через 59 секунд
Цитата Сообщение от RAFA91 Посмотреть сообщение
C++
1
return (x == k) ? true : false;
вы проверяете равенство чисел (т.е. это условие сработает только для степеней двойки), а не то, установлен ли бит.

Добавлено через 8 минут
И вообще, какой смыл выражение, имеющее тип bool, пихать в тернарный оператор, возвращающий true или false?
1
RAFA91
Заблокирован
19.06.2015, 14:44  [ТС] #9
Цитата Сообщение от XZentus Посмотреть сообщение
И вообще, какой смыл выражение, имеющее тип bool, пихать в тернарный оператор, возвращающий true или false?

мне мои функции нравятся больше.

свое намного роднее

и что Вас тут смущает ?
C++
1
return (x == k) ? true : false;
если бит установлен то возвращаем true . в противном случае false;

Цитата Сообщение от XZentus Посмотреть сообщение
а не то, установлен ли бит.

все окей. посмотрите лучше.
0
IceCortez
25 / 25 / 19
Регистрация: 25.03.2014
Сообщений: 233
19.06.2015, 14:48 #10
Мы меняем эту строку на
C++
1
return (x == k);
И???? Ничего не меняется!
0
XZentus
201 / 199 / 41
Регистрация: 06.10.2013
Сообщений: 552
19.06.2015, 14:49 #11
Цитата Сообщение от RAFA91 Посмотреть сообщение
и что Вас тут смущает ?
Что это масло масляное.
0
IceCortez
19.06.2015, 14:52
  #12

Не по теме:

Ваши "родные" функции работают за О(n), а функция Croessmah работает за О(1), делаем выводы...

0
RAFA91
Заблокирован
19.06.2015, 15:50  [ТС] #13
Цитата Сообщение от IceCortez Посмотреть сообщение
И???? Ничего не меняется!
это да
0
castaway
19.06.2015, 16:37
  #14

Не по теме:

IceCortez, просто мистер RAFA91 любит простить советы, и делать по-своему (не так как делают все или как посоветовали).

0
Croessmah
Эксперт CЭксперт С++
13514 / 7673 / 866
Регистрация: 27.09.2012
Сообщений: 18,891
Записей в блоге: 3
Завершенные тесты: 1
19.06.2015, 19:09 #15
Цитата Сообщение от IceCortez Посмотреть сообщение
а функция Croessmah работает за О(1), делаем выводы...
Всё зависит от типа T

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
просто мистер RAFA91 любит простить советы, и делать по-своему
уже попадался, да?

0
19.06.2015, 19:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2015, 19:09
Привет! Вот еще темы с ответами:

Работа с битами - C++
три раза писал но все равно не получается((( 1-)Ввести последовательность из 8 символов. Сравнить 5-й и 6-й биты каждого символа. Если...

Работа с битами. - C++
Здрасте. Дана задача: Определить на сколько в числе А больше значущих битов, что равны единице, чем битов, что равны нулю. Помогите...

Работа с битами - C++
Я уже задолбался... :wall: Может мне кто нибудь подскажет как из 00111010 (58) получить 00001010 (10) хотя бы каким методом... код...

Работа с битами - C++
Не могу понять, почему не правильно работает программа. Программа зашифровывает строку, выводит, потом расшифровывает и выводит. ...


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

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

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