/ / Postgres динамично задава битов размер - съхранени процедури, бит, postgresql-9.3

Postgres задават динамичен размер на бита - съхранявани процедури, бит, postgresql-9.3

Целта е бързо извличане на бит в позиция N; Досега намерих само този начин да направя това:

CREATE OR REPLACE FUNCTION test(x int, size int)
RETURNS int AS
$BODY$
DECLARE
y int;

BEGIN
y = get_bit(x::bit(size)>>size-1,size-1);


return y;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Но това се казва заради бит (размер)

невалиден синтаксис на въвеждане за цяло число: "размер"

Така че аз се принудих да пиша размера като константа, например бит (3)

Има ли начин за динамично задаване на битовия размер? Като алтернатива, може би има някои други начини за извличане на конкретен бит int / text?

Отговори:

1 за отговор № 1

За това не са ви необходими типове битови полета. За да тествате бит 6 от стойността 200:

SELECT 200 & (1<<6) != 0

вие двоично-И стойност с набор от 6-ти бит, като преместите 1 на 6 основни-2 места, след това тествайте, за да видите дали резултатът е ненулев.

Алтернативно, хвърляне до подходящ битов размер въз основа на цялото число и употреба position, въпреки че мисля, че няма никаква причина да се прави това, когато можете да използвате изключително бързо побитово И и се премества както по-горе. Защото get_bit числа отляво и използва 1-офсет вместо 0-офсет, трябва да вземете комплимента от 31 (за 32-битов int), за да получите позицията отдясно:

SELECT get_bit(200::bit(32), 31 - 6);

така че е път по-просто да се използват само битови операции като първия пример.