Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
RAFA91
Заблокирован
1

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

17.06.2015, 15:09. Просмотров 1012. Ответов 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
Ответы с готовыми решениями:

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

Операции с битами в c++
Помогите начинающему. Объясните пожалуйста как работает данная функция void...

Объединение. Операции с битами
Напишите программу, которая вычисляет произведение любого целого без знака...

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

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

39
IceCortez
25 / 25 / 42
Регистрация: 25.03.2014
Сообщений: 233
17.06.2015, 15:23 2
C++
1
&
Не знаю, что вы хотели сделать в коде, но похоже, что надо
C++
1
x &= y;
0
Kuzia domovenok
2405 / 2124 / 511
Регистрация: 25.03.2012
Сообщений: 7,638
Записей в блоге: 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. Видимо, любит он это дело :D

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
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 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 ;
}
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 / 65
Регистрация: 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 / 42
Регистрация: 25.03.2014
Сообщений: 233
19.06.2015, 14:48 10
Мы меняем эту строку на
C++
1
return (x == k);
И???? Ничего не меняется!
0
XZentus
201 / 199 / 65
Регистрация: 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
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
19.06.2015, 19:09 15
Цитата Сообщение от IceCortez Посмотреть сообщение
а функция Croessmah работает за О(1), делаем выводы...
Всё зависит от типа T

Не по теме:

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

0
castaway
19.06.2015, 19:17
  #16

Не по теме:

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

0
Kastaneda
Jesus loves me
Эксперт С++
4943 / 3020 / 346
Регистрация: 12.12.2009
Сообщений: 7,622
Записей в блоге: 2
Завершенные тесты: 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?");
}
правда для корректной работы/компиляции это совершенно лишнее, но так хоть вменяемое сообщение в логе компиляции будет
1
RAFA91
Заблокирован
21.06.2015, 14:21  [ТС] 18
Цитата Сообщение от Croessmah Посмотреть сообщение
Всё зависит от типа T
у меня тип один
C++
1
unsigned short
думаю 2 байта мне хватит. все же 16 флагов имею.
0
Croessmah
++Ͻ
14740 / 8422 / 1597
Регистрация: 27.09.2012
Сообщений: 20,714
Записей в блоге: 2
Завершенные тесты: 1
21.06.2015, 14:26 19
Цитата Сообщение от Kastaneda Посмотреть сообщение
можно как-нибудь так
Цитата Сообщение от Croessmah Посмотреть сообщение
Всё зависит от типа T
Это я к тому, что если тип T - какой-то свой тип, с перегруженными операторами (например, какой нибудь MySuperBicycle_LongNumber), то сложность врядли будет O(1)
0
RAFA91
Заблокирован
27.06.2015, 15:49  [ТС] 20
Подскажите пожалуйста , как произвести логический сдвиг влево - вправо ?
0
27.06.2015, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2015, 15:49

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

При вводе данных программа пропускает операции cin
Описать структуру с именем note, содержащую следующие поля:  фамилия, имя; ...

работа с битами
доброй ночи, форумчане, необходима ваша помощь) как и всем тут... вот изучаю...


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

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

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