powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Int2Bin ?
12 сообщений из 12, страница 1 из 1
Int2Bin ?
    #38372148
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, коллеги!
А существует ли какая-то простая реализация сабж? А то биты нужно посмотреть в integer-значениях, а городить для этого что-то не хотелось бы.
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372373
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill Razuvaev,

Читай про BIN_AND() и перебирай битики. Или на клиенте такое крути.

Примерно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create procedure INT2BIN(N integer)
returns (RESULT varchar(100))
as
declare variable I integer;
declare variable MASK bigint;
begin
  I=1; MASK=1; RESULT='';
  while (i<=32) do
    begin
       if (BIN_AND(N,MASK)=0) then RESULT='0'||RESULT;
       else RESULT='1'||RESULT;
       MASK=MASK*2;
       I=I+1;
    end
  suspend;
end
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372391
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если только посмотреть битики, то все намного проще

Bit_Is_set(Bit_Num) = ( Bit_Container and (1 shl Bit_Num) <> 0 )

просто переведи это в синтаксис SQL
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372415
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня завалялся такой вариант процедуры.
Перебирает кусками по 4 бита.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create or alter procedure INT2BITSTRING (
    I integer)
returns (
    BITSTR varchar(32))
AS
declare variable bits char(64) = '0000000100100011010001010110011110001001101010111100110111101111';
declare variable cnt integer = 8;
declare variable n integer;
declare variable bitchunk integer;
declare variable sign char(1);
begin
  bitstr = '';
  if (i < 0) then begin sign = '1'; i = 2147483648+i; end else sign = '0';
  while (cnt > 0) do begin
    n = i/16;
    if (i/16 < n) then n = n-1;
    bitchunk = i-n*16;
    i = n;
    bitstr = substring(bits from bitchunk*4+1 for 4) || bitstr;
    cnt = cnt-1;
  end
  bitstr = sign || substring(bitstr from 2);
  suspend;
end
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372446
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevЗдравствуйте, коллеги!
А существует ли какая-то простая реализация сабж? А то биты нужно посмотреть в integer-значениях, а городить для этого что-то не хотелось бы.дык легко, вроде бы , ежели ФБ >= 2.1...
Разминки мозга ради:
Код: 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.
39.
40.
41.
42.
43.
C:\MIX\firebird\fb25>isql 192.168.99.44/3252:trntest
Database:  192.168.99.44/3252:trntest
SQL> show version;
ISQL Version: WI-V2.5.3.26661 Firebird 2.5
Server version:
Firebird/linux AMD64 (access method), version " LI-V2.5.3.26683  Firebird 2.5"
Firebird/linux AMD64 (remote server), version "LI-V2.5.3.26683 Firebird 2.5/tcp (vmoel63.local)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26661 Firebird 2.5/tcp (csprog)/P12"
on disk structure version 11.2
SQL>
SQL>
SQL> set list off;
SQL> select mon$sql_dialect from mon$database;

MON$SQL_DIALECT
===============
              3

SQL> with recursive
CON> r as(
CON>   select 0 p,cast(1 as bigint) n from rdb$database
CON>   union all
CON>   select r.p+1, cast(power(2,r.p+1) as bigint) from r
CON>   where r.p<63
CON> )
CON> ,v as( select cast(123654789054321 as bigint) x from rdb$database)
CON> ,s as(
CON>     select r.p, r.n, v.x, cast(sign(bin_and(v.x,r.n)) as varchar(64)) bs
CON>     from r,v
CON>     where r.p=63
CON>     union all
CON>     select s.p-1, s.n/2, s.x, s.bs || cast(sign(bin_and(s.x,abs(s.n/2))) as varchar(64))
CON>     from s where s.p>0
CON> )
CON> select s.x x_decimal, replace(trim(replace(bs,'0',' ')),' ','0') x_binary
CON> from s where s.p=0
CON> ;

            X_DECIMAL X_BINARY

===================== ===============================================================================
      123654789054321 11100000111011010011111110001101011111101110001


... а с другой стороны, копипаст этого запроса , но в чуток более старую версию ФБ, выдаёт "column unknown"...
Код: 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.
39.
40.
41.
42.
43.
SQL> select mon$sql_dialect from mon$database;

MON$SQL_DIALECT                 3


SQL> set list off;
SQL> show version;
ISQL Version: WI-V2.5.3.26661 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version " WI-V2.5.3.26661  Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.3.26661 Firebird 2.5/XNet (CSPROG)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26661 Firebird 2.5/XNet (CSPROG)/P12"
on disk structure version 11.2
SQL> select mon$sql_dialect from mon$database;

MON$SQL_DIALECT
===============
              3

SQL> with recursive
CON> r as(
CON>   select 0 p,cast(1 as bigint) n from rdb$database
CON>   union all
CON>   select r.p+1, cast(power(2,r.p+1) as bigint) from r
CON>   where r.p<63
CON> )
CON> ,v as( select cast(123654789054321 as bigint) x from rdb$database)
CON> ,s as(
CON>     select r.p, r.n, v.x, cast(sign(bin_and(v.x,r.n)) as varchar(64)) bs
CON>     from r,v
CON>     where r.p=63
CON>     union all
CON>     select s.p-1, s.n/2, s.x, s.bs || cast(sign(bin_and(s.x,abs(s.n/2))) as varchar(64))
CON>     from s where s.p>0
CON> )
CON> select s.x x_decimal, replace(trim(replace(bs,'0',' ')),' ','0') x_binary
CON> from s where s.p=0
CON> ;
Statement failed, SQLSTATE = 42S22
Dynamic SQL Error
-SQL error code = -206
-Column unknown
-S.P
-At line 15, column 20
Так что вот: "выбирайте маршруты объезда!"
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372493
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уфф.... да что же это такое!.. опять эта хрень с power(2, 52) прёт:
Код: 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.
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.
SQL> select cast(power(2,52) as bigint) from rdb$database;

                 CAST
=====================
     4503599627370497

SQL> show version;
ISQL Version: WI-V2.5.3.26661 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-T3.0.0.30590 Firebird 3.0 Alpha 1"
Firebird/x86/Windows NT (remote server), version "WI-T3.0.0.30590 Firebird 3.0 Alpha 1/tcp (CSMIRROR)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26661 Firebird 2.5/tcp (csprog)/P12"
on disk structure version 12.0

SQL> show version;
ISQL Version: WI-V2.5.3.26661 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.3.26661 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.3.26661 Firebird 2.5/XNet (CSPROG)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26661 Firebird 2.5/XNet (CSPROG)/P12"
on disk structure version 11.2
SQL> select cast(power(2,52) as bigint) from rdb$database;

                 CAST
=====================
     4503599627370497

SQL> show version;
ISQL Version: WI-V2.5.3.26682 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.3.26682 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.3.26682 Firebird 2.5/tcp (CSMIRROR)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26682 Firebird 2.5/tcp (CSMIRROR)/P12"
on disk structure version 11.2
SQL> select cast(power(2,52) as bigint) from rdb$database;

                 CAST
=====================
     4503599627370497


SQL> show version;
ISQL Version: WI-V2.5.3.26682 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.3.26682 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.3.26682 Firebird 2.5/tcp (CSMIRROR)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26682 Firebird 2.5/tcp (CSMIRROR)/P12"
on disk structure version 11.2
SQL> select cast(power(2,52) as bigint) from rdb$database;

                 CAST
=====================
     4503599627370497

SQL> show version;
ISQL Version: LI-T3.0.0.30590 Firebird 3.0 Alpha 1
Server version:
Firebird/Linux/AMD/Intel/x64 (access method), version " LI-T3.0.0.30590  Firebird 3.0 Alpha 1"
Firebird/Linux/AMD/Intel/x64 (remote server), version "LI-T3.0.0.30590 Firebird 3.0 Alpha 1/tcp (vmoel63.local)/P13:C"
Firebird/Linux/AMD/Intel/x64 (remote interface), version "LI-T3.0.0.30590 Firebird 3.0 Alpha 1/tcp (vmoel63.local)/P13:C"
on disk structure version 12.0
SQL> select cast(power(2,52) as bigint) from rdb$database;

                 CAST
=====================
     4503599627370497

SQL> show version;
ISQL Version: LI-T3.0.0.30590 Firebird 3.0 Alpha 1
Server version:
Firebird/Linux/AMD/Intel/x64 (access method), version " LI-V2.5.3.26683  Firebird 2.5"
Firebird/Linux/AMD/Intel/x64 (remote server), version "LI-V2.5.3.26683 Firebird 2.5/tcp (vmoel63.local)/P12"
Firebird/Linux/AMD/Intel/x64 (remote interface), version "LI-T3.0.0.30590 Firebird 3.0 Alpha 1/tcp (vmoel63.local)/P12"
on disk structure version 11.2
SQL> select cast(power(2,52) as bigint) from rdb$database;

                 CAST
=====================
     4503599627370497



SQL> show version;
ISQL Version: WI-V2.5.3.26682 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.3.26682 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.3.26682 Firebird 2.5/tcp (CSMIRROR)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26682 Firebird 2.5/tcp (CSMIRROR)/P12"
on disk structure version 11.2
SQL> select cast(power(2,52) as bigint) from rdb$database;

                 CAST
=====================
     4503599627370497
2 dimitr: а прошить в жёсткую никак там нельзя, что 2^52 = 450359962737049 6 и без вариантов ? А то уже и линуховые сборки глюкавить начали...
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372507
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид"выбирайте маршруты объезда!" мнда, именно так!
Лучше пусть через Жо, но чтобы в итоге было Пра.
Новый маршрут, к тому же только с одной рекурсией.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with recursive
v as( select cast(123654789054321 as bigint) x -- tested value
        from rdb$database
)
,r as(
  select 0 p, v.x, cast(sign(bin_and(v.x,1)) as varchar(64)) bs from v
  union all
  select r.p+1, r.x,
         -- из-за идиоцтва с плавающей точкой для power(2, 52):
         r.bs||cast(abs(sign(bin_and(r.x,cast(power(2,r.p+1)  -0.5  as bigint)))) as varchar(64)) 
   from r
  where r.p<63
)
select x x_dec, replace(trim(replace(reverse(bs),'0',' ')),' ','0') x_bin
from r where p=63
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372580
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно забавная картина, бага в чистом виде.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select
  t1.f1,
  t1.f2,
  t1.f3,
  t1.f4,
  cast(t1.f1 as bigint) as f5
from
(
select
  cast(power(2,52) as bigint) as f1,
  power(2,52) as f2,
  4503599627370496 as f3,
  cast(4503599627370496 as bigint) as f4
 from rdb$database
) t1



SQL> show version;
ISQL Version: LI-V2.5.3.26661 Firebird 2.5
Server version:
Firebird/linux AMD64 (access method), version "LI-V2.5.3.26661 Firebird 2.5"
on disk structure version 11.2
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372703
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterЧитай про BIN_AND() и перебирай битики. Или на клиенте такое крути.Да конструкции с BIN_AND и циклом, равно как и с кучей BIN-AND+BIN_SHR по числу разрядов понятны. Была надежда обойтись чем-то более коротким и без ХП, например, какой-нить изврат из серии кодировок или т.п.:-)
...
Рейтинг: 0 / 0
Int2Bin ?
    #38372969
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill RazuvaevDarkMasterЧитай про BIN_AND() и перебирай битики. Или на клиенте такое крути.Да конструкции с BIN_AND и циклом, равно как и с кучей BIN-AND+BIN_SHR по числу разрядов понятны. Была надежда обойтись чем-то более коротким и без ХП, например, какой-нить изврат из серии кодировок или т.п.:-)

Ну без ХП тебе Таблоид уже изврат предложил ;) Можешь еще в execute block завернуть, если очень хочется...
...
Рейтинг: 0 / 0
Int2Bin ?
    #38373296
Kirill Razuvaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterНу без ХП тебе Таблоид уже изврат предложилИзврат достойный - мозг сломать можно, но в вычисляемое поле засовывать неудобно :-)
...
Рейтинг: 0 / 0
Int2Bin ?
    #38373324
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kirill Razuvaev,

Триггером считай.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Int2Bin ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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