Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить 8-й бит из числа? / 6 сообщений из 6, страница 1 из 1
24.11.2020, 15:04
    #40021754
lr2
lr2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить 8-й бит из числа?
Всем привет.


Думал это делает get_bit.

Но он выдает какую-то ерунду.


Возмем, например число 256.

Это 2 в 8-й степени.


Переводим в биты:


Код: sql
1.
2.
SELECT 256::bit(12)::text
"000100000000"




А теперь пробую побитно взять get_bit для него:




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT
get_bit(256::bit(12)::text::bytea, 12),
get_bit(256::bit(12)::text::bytea, 11),
get_bit(256::bit(12)::text::bytea, 10),
get_bit(256::bit(12)::text::bytea, 9),
get_bit(256::bit(12)::text::bytea, 8),
get_bit(256::bit(12)::text::bytea, 7),
get_bit(256::bit(12)::text::bytea, 6),
get_bit(256::bit(12)::text::bytea, 5),
get_bit(256::bit(12)::text::bytea, 4),
get_bit(256::bit(12)::text::bytea, 3),
get_bit(256::bit(12)::text::bytea, 2),
get_bit(256::bit(12)::text::bytea, 1),
get_bit(256::bit(12)::text::bytea, 0)

1;0;0;0;0;0;0;1;1;0;0;0;0




1000000110000 не равно 000100000000


Как можно вычислить этот бит из числа int?

000 1 00000000
...
Рейтинг: 0 / 0
24.11.2020, 15:37
    #40021762
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить 8-й бит из числа?
lr2,

get_bit и есть
только он слева биты считает

Код: plaintext
1.
2.
3.
4.
select get_bit(256::bit(12), 12-8-1);
 get_bit 
---------
       1
биты слева он считает... от нуля... поэтому 12-8-1

а вот ::text::bytea - тут лишнее и только все запутывает.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
24.11.2020, 15:43
    #40021765
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить 8-й бит из числа?
lr2,

еще наличие проставленного 8го бита так можно в числе

select (256 & power(2, 8 )::int)::boolean;
bool
------
t

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
24.11.2020, 15:54
    #40021771
grgdvo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить 8-й бит из числа?
не так немного

Код: sql
1.
select (256 & (1 << 8)) >> 8;



256 & 256 == 256
к булу прикаститься как true
ну хотя и так и так будет true или false :)
...
Рейтинг: 0 / 0
25.11.2020, 12:24
    #40022030
lr2
lr2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить 8-й бит из числа?
Maxim Boguk
lr2,

get_bit и есть
только он слева биты считает

Код: plaintext
1.
2.
3.
4.
select get_bit(256::bit(12), 12-8-1);
 get_bit 
---------
       1
биты слева он считает... от нуля... поэтому 12-8-1

а вот ::text::bytea - тут лишнее и только все запутывает.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru




Да, спасибо!!!

Работает!!!





Я тут только одного не пойму, что такое 12-8-1. Ну 8 - это вроде как 8-й бит. А остальное что что?
Развернутого описания get_bit чет не нашел.

Только такое:

get_bit(string, offset) int Извлекает бит из строки get_bit('Th\000omas'::bytea, 45) 1
...
Рейтинг: 0 / 0
25.11.2020, 14:10
    #40022089
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить 8-й бит из числа?
lr2
[


Да, спасибо!!!

Работает!!!

Я тут только одного не пойму, что такое 12-8-1. Ну 8 - это вроде как 8-й бит. А остальное что что?
Развернутого описания get_bit чет не нашел.

Только такое:

get_bit(string, offset) int Извлекает бит из строки get_bit('Th\000omas'::bytea, 45) 1



Развернутое описание get_bit в функциях для bitstring
https://www.postgresql.org/docs/13/functions-bitstring.html

и звучит оно как
Код: plaintext
1.
2.
3.
4.
5.
get_bit ( bits bit, n integer ) → integer

Extracts n'th bit from bit string;  the first (leftmost) bit is bit 0 .

get_bit(B'101010101010101010', 6) → 1

Соответственно 12 это от bit(12) потому что считаем слева... -1 потому что самый левый бит у нее номер ноль имеет а не один (так что для вашей нумерации еще надо единицу отнять).

Решение ниже
Код: plsql
1.
select (256 & (1 << 8)) >> 8;

на самом деле проще и понятнее но работает только до 30того бита (ну или в варианте bigint 1::bigint<<62 до 62 бита).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как получить 8-й бит из числа? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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