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

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

Восстановить пароль Регистрация
 
 
RAFA91
Заблокирован
17.06.2015, 15:09     Операции с битами данных #1
Всем доброго дня !

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

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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2015, 15:09     Операции с битами данных
Посмотрите здесь:

Работа с битами. C++
C++ Работа с битами
Класс «Дата» - поля данных и перегруженные операции C++
Работа с битами C++
операции для работы с битами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IceCortez
25 / 25 / 19
Регистрация: 25.03.2014
Сообщений: 233
17.06.2015, 15:23     Операции с битами данных #2
C++
1
&
Не знаю, что вы хотели сделать в коде, но похоже, что надо
C++
1
x &= y;
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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";
Croessmah
17.06.2015, 15:58
  #4

Не по теме:

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

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 ?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 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 ;
}
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;
}
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?
RAFA91
Заблокирован
19.06.2015, 14:44  [ТС]     Операции с битами данных #9
Цитата Сообщение от XZentus Посмотреть сообщение
И вообще, какой смыл выражение, имеющее тип bool, пихать в тернарный оператор, возвращающий true или false?

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

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

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

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

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

Не по теме:

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

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

Не по теме:

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

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
19.06.2015, 19:09     Операции с битами данных #15
Цитата Сообщение от IceCortez Посмотреть сообщение
а функция Croessmah работает за О(1), делаем выводы...
Всё зависит от типа T

Не по теме:

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

castaway
19.06.2015, 19:17
  #16

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
уже попадался, да?
Было дело

Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.06.2015, 21:02     Операции с битами данных #17
Croessmah, можно как-нибудь так
C++
1
2
3
4
5
6
7
8
9
10
11
template < typename T >
inline bool get_bit ( const T & number , unsigned short index, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr )
{
    return (1<<index)&number ;
}
 
template < typename T >
inline bool get_bit ( const T & number , unsigned short index )
{
    static_assert(false, "Are you crazy? Do you want to have operator & with non integer type?");
}
правда для корректной работы/компиляции это совершенно лишнее, но так хоть вменяемое сообщение в логе компиляции будет
RAFA91
Заблокирован
21.06.2015, 14:21  [ТС]     Операции с битами данных #18
Цитата Сообщение от Croessmah Посмотреть сообщение
Всё зависит от типа T
у меня тип один
C++
1
unsigned short
думаю 2 байта мне хватит. все же 16 флагов имею.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,898
Записей в блоге: 2
Завершенные тесты: 1
21.06.2015, 14:26     Операции с битами данных #19
Цитата Сообщение от Kastaneda Посмотреть сообщение
можно как-нибудь так
Цитата Сообщение от Croessmah Посмотреть сообщение
Всё зависит от типа T
Это я к тому, что если тип T - какой-то свой тип, с перегруженными операторами (например, какой нибудь MySuperBicycle_LongNumber), то сложность врядли будет O(1)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2015, 15:49     Операции с битами данных
Еще ссылки по теме:

Работа с битами C++
Операции с битами C++
Объединение. Операции с битами C++

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

Или воспользуйтесь поиском по форуму:
RAFA91
Заблокирован
27.06.2015, 15:49  [ТС]     Операции с битами данных #20
Подскажите пожалуйста , как произвести логический сдвиг влево - вправо ?
Yandex
Объявления
27.06.2015, 15:49     Операции с битами данных
Ответ Создать тему
Опции темы

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