Re: Как закодировать?

From
Pavel P ()
To
Andrew Ezhguroff
Date
2002-10-08T13:11:38Z
Area
RU.ALGORITHMS
From: "Pavel P" <vprin@indiainfo.com>


"Andrew Ezhguroff" <eandr@com2com.ru> wrote in message
news:ans8lm$v6j$1@host.talk.ru...
[....]
> Итерации:
>
> #include <limits.h>
>
> void printbin(int val){
>   char Buf[CHAR_BIT*sizeof(int)];
>   char *Tmp = Buf;
>
>   do{
>     *Tmp++ = '0'+(val&1);
>     val=(val>>1)&INT_MAX
>   }while(val);
>
>   while(Tmp!=Buf)putchar(*--Tmp);
> }
>
> Рекурсия:
>
> void printbin(int val){
>   char Tmp = (val&1)+'0';
>   if(val=(val>>1)&INT_MAX)printbin(val);
>   putchar(Tmp);
> }
>
> А вот в СТАНДАРТНОМ (борландовские извращения меня не интересуют) Паскале
> битовых операций и сдвигов для целых нет. Так что придется делать через
div
> и odd (или mod), да еще контролировать кол-во знаков (из-за "клонирования"
> знакового разряда). Либо через запись с вариантами, где одно поле - целое,
а
> второе - множество.

Мало ли чего нет в стандартном Паскале. Ты его живьем то видел? С его
виртуальной машиной Р-кода? А остальные клоны имеют эти операции.
С тем же успехом можно сказать что в стандартном С тоже много чего нет
и делать это надо через n-ной место :) Хотя многие до сих пор думают
что на нем самая краткая запись :) Люди не пишите на С :) Пишите вот так :)

toBin 0 = "0"
toBin x = f x
where
   f 0 = ""
   f x = f (x >> 1 bitand INT_MAX) +++ toString (x bitand 1)

Сам догадаешься почему приведеный пример на порядок лучше чем твой С ?
Кстати (>>, bitand, toString, +++) стандартные функции

B.R.
Pavel


--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)