Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / C: Bitwise Operators / 20 сообщений из 20, страница 1 из 1
29.05.2020, 02:09
    #39963802
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
не понимаю, как работать с битовыми операторами ...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
&    bitwise AND
¦    bitwise inclusive OR
^    bitwise exclusive OR
~    one’s complement (unary)

Что, например, тут происходит? Просьба расписать поподробнее!

1) n = n & 0177;
2) x = x & ~077
3) x = x ¦ 15 

4) функция из КР
Код: plaintext
1.
2.
3.
4.
5.
6.
/* getbits:  get n bits from position p */

unsigned getbits(unsigned x, int p, int n)
{    
    return (x >> (p+1-n)) & ~(~0 << n);
}
...
Рейтинг: 0 / 0
29.05.2020, 03:20
    #39963816
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
тут что не понятно? https://ru.wikipedia.org/wiki/Битовая_операция
пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
// Example program
#include <iostream>
#include <bitset>
#include <climits>

int main() 
{
    char num = 32;
    
    std::cout << "255 & 53 =" << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(255) << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(53) << std::endl;
    std::cout << "\t" << "--------" << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(255 & 53) << " = " << (255 & 53) << std::endl;
    std::cout << std::endl;
    
    std::cout << "255 & ~53 =" << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(255) << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(~53) << " (~53)" << std::endl;
    std::cout << "\t" << "--------" << std::endl;
    std::cout << "\t" <<  std::bitset<sizeof(num) * CHAR_BIT>(255 & ~53) << " = " << (255 & ~53) << std::endl;
}


вывод программы
255 & 53 =
11111111
00110101
--------
00110101 = 53

255 & ~53 =
11111111
11001010 (~53)
--------
11001010 = 202
...
Рейтинг: 0 / 0
29.05.2020, 03:55
    #39963829
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
mini.weblab
не понимаю, как работать с битовыми операторами
...
4) функция из КР
...

Код: plaintext
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.
// Example program
#include <iostream>
#include <bitset>
#include <climits>


/* getbits:  get n bits from position p */
unsigned getbits(unsigned x, unsigned p, unsigned n)
{    
    std::cout << "getbits("<< x<< "," << p << "," << n << ");" << std::endl; 
    
    std::cout << "~0 =" << std::endl;
    std::cout << std::bitset<sizeof(~0) * CHAR_BIT>(~0) << std::endl;
    std::cout << "(~0 << n) =" << std::endl;
    std::cout << std::bitset<sizeof(~0 << n) * CHAR_BIT>(~0 << n) << std::endl;
    std::cout << "~(~0 << n) =" << std::endl;
    std::cout << std::bitset<sizeof(~(~0 << n)) * CHAR_BIT>(~(~0 << n)) << std::endl;
    std::cout << std::endl;
    
    std::cout << "x =" << std::endl;
    std::cout << std::bitset<sizeof(x) * CHAR_BIT>(x) << std::endl;
    std::cout << "(x >> (p+1-n)) =" << std::endl;
    std::cout << std::bitset<sizeof(x >> (p+1-n)) * CHAR_BIT>(x >> (p+1-n)) << std::endl;
    std::cout << std::endl;
    std::cout << "(x >> (p+1-n)) & ~(~0 << n) = " << std::endl;
    std::cout << std::bitset<sizeof(~(~0 << n)) * CHAR_BIT>(~(~0 << n)) << std::endl;
    std::cout << std::bitset<sizeof(x >> (p+1-n)) * CHAR_BIT>(x >> (p+1-n)) << std::endl;
    std::cout << "--------------------------------" << std::endl;
    std::cout << std::bitset<sizeof((x >> (p+1-n)) & ~(~0 << n)) * CHAR_BIT>((x >> (p+1-n)) & ~(~0 << n)) << "  (" << ((x >> (p+1-n)) & ~(~0 << n)) << ")" << std::endl;
    
    return (x >> (p+1-n)) & ~(~0 << n);
}


int main() 
{
    std::cout << getbits(1234567890, 10, 6);
}


вывод программы
getbits(1234567890,10,6);
~0 =
11111111111111111111111111111111
(~0 << n) =
11111111111111111111111111000000
~(~0 << n) =
00000000000000000000000000111111

x =
01001001100101100000001011010010
(x >> (p+1-n)) =
00000010010011001011000000010110

(x >> (p+1-n)) & ~(~0 << n) =
00000000000000000000000000111111
00000010010011001011000000010110
--------------------------------
00000000000000000000000000010110 (22)
22
...
Рейтинг: 0 / 0
29.05.2020, 07:27
    #39963847
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
Я бы "Bitwise" переводил как "побитовые", т.к. это ближе к смыслу. Суть в том что операнды рассматриваются как массивы битов и операция происходит отдельно для каждого бита.
Значение 1 рассматривается как true и дальше по аналогии с логическими операциями.

Для рассмотрения конкретных значений надо их представлять в двоичном виде и дополнять нулями до нужной разрядности.
Например uint8_t (разрядность 8 бит)
Код: plaintext
1.
2.
3.
177 = 1011 0001
 77 = 0100 1101
 177|77= 
253 = 1111 1101
...
Рейтинг: 0 / 0
29.05.2020, 10:45
    #39963916
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
mini.weblab

1) n = n & 0177;

Здесь справа стоит восьмеричная константа. Надо быть осторожным т.к. мы часто ошибочно ее видим глазами.

По смыслу это похоже на выделение в n групп битов по 3 штуки. Как в Unix файловых правах.
Например 177 (восьмеричной) => 001 111 111 в двоичной.

Тоесть после этой операции если n = 010 010 101 результат будет пересечением битов тоесть 000 010 101.

Честно я не вижу особого смысла в наше время юзать восьмеричку. В bash например ее элегантно
заменяют символические привилегии (chmod u+rwx) например для владельца поставить все три битика.
И так просто и понятно. И когда Unix админ лупит три семерки - это такой себе кич. Дай бох он сможет
в голове проинтерпретирвоать более сложную маску.
...
Рейтинг: 0 / 0
29.05.2020, 12:43
    #39964011
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
m_Sla, Dima_T, mayton

спасибо ! каждый ответ добавил что-то новое !

и теперь я, наконец, разберусь в побитовых операциях.
(обычно этот раздел я всегда пропускала) :-)
...
Рейтинг: 0 / 0
29.05.2020, 13:14
    #39964038
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
mini.weblab, это таже Булева алгебра, но только поразрядно для двоичной системы счисления.
...
Рейтинг: 0 / 0
29.05.2020, 17:00
    #39964182
C: Bitwise Operators
mayton
И когда Unix админ лупит три семерки - это такой себе кич. Дай бох он сможет
в голове проинтерпретирвоать более сложную маску.

hex в помощь
YouTube Video
...
Рейтинг: 0 / 0
30.05.2020, 16:11
    #39964399
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
Алексей Роза, зачем мне это? Это - поверхностно.
...
Рейтинг: 0 / 0
30.05.2020, 17:52
    #39964432
C: Bitwise Operators
а по-моему весьма глубоко
даёт отличное понимание, как биты работают
...
Рейтинг: 0 / 0
30.05.2020, 18:00
    #39964438
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
Мы в школе играли в конспирологию. Записочками перекидывались. Ну придумывали секретный язык
из закорючек чтоб учителя не поняли. И я тогда выучил двоичный код.

Но если вы работаете в баше и вам надо дать доступ к группе например на запись - то самый лучший вариант
это chmod +gr. А не игры в уме с дизъюнкцией. Еще напутаете. А это - прод. И вас накажут. За неряшливость.
...
Рейтинг: 0 / 0
30.05.2020, 20:45
    #39964494
C: Bitwise Operators
будто бы +gr нельзя напутать с +gw
если ты неряшлив, ты всегда найдёшь где напутать
а понимать, что FF это на самом деле 1111 + 1111, это важно.
...
Рейтинг: 0 / 0
30.05.2020, 20:54
    #39964502
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
Алексей Роза
а понимать, что FF это на самом деле 1111 + 1111, это важно.

Детский сад какой-то
...
Рейтинг: 0 / 0
30.05.2020, 23:04
    #39964535
C: Bitwise Operators
а я вот уверен, что явисты и питоны не в курсе.
...
Рейтинг: 0 / 0
30.05.2020, 23:35
    #39964541
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
Алексей Роза,
FF = 11111111, а 1111+1111 = 11110 = 1E
совет автор дает правильный, к 16чной системе нужно привыкнуть
...
Рейтинг: 0 / 0
30.05.2020, 23:44
    #39964543
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
Изопропил
Алексей Роза
а понимать, что FF это на самом деле 1111 + 1111, это важно.

Детский сад какой-то

Да у Алексея Розы вообще бардак какой-то в голове. Впрочем, есть мнение, что у истинно творческих людей всегда бардак в голове. Но обратное неверно. Те у кого бардак в голове не всегда являются истинно творческими людьми. :)
...
Рейтинг: 0 / 0
30.05.2020, 23:48
    #39964545
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
Стоп оффтоп.
...
Рейтинг: 0 / 0
31.05.2020, 09:42
    #39964566
C: Bitwise Operators
mini.weblab
FF = 11111111, а 1111+1111 = 11110 = 1E

+ в данном случае это пробел
...
Рейтинг: 0 / 0
15.06.2020, 10:57
    #39969254
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
mini.weblab, зачем привыкать к 16-тиричной системе счисления при изучении битовых операций, использующих двоичную систему? :)
...
Рейтинг: 0 / 0
15.06.2020, 11:07
    #39969258
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C: Bitwise Operators
rdb_dev
mini.weblab, зачем привыкать к 16-тиричной системе счисления при изучении битовых операций, использующих двоичную систему? :)

Это как езда на велосипеде без рук. Понты колотить можно.

Но с другой стороны держать в голове табличку типа 0xF = 1111(b), 0xE = ... e.t.c.
это очень полезно по жизни. Всегда есть легаси язык или среда где нет нативной
поддержки двоичной системы.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / C: Bitwise Operators / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]