28.06.2009 10:14 |
Lester |
Быстрое возведение в степень( сложность алгоритма O(lnn) вместо O(n) ).
PHP код:
// возведение t в степень k int power( int t, int k ) { int res = 1; while( k ) { if( k & 1 ) res *= t;
t *= t; k >>= 1; }
return res; }
http://ru.wikipedia.org/wiki/%D0%90%...B5%D0%BD%D1%8C
|
17.06.2009 00:42 |
Lester |
Программа, которая работает одновременно в C, C++, Haskell, Ruby, Python, Perl(x2), HTML, tcl, bash, zsh, make, bash и brainfuck:
PHP код:
# /* [ <!-- */ include <stdio.h> /* \ #{\ `""""true \\#{"\n#"}; \ \ if [ -n "$ZSH_VERSION" ]; then \ \ echo exec echo I\'m a zsh script.; \ \ elif [ -n "$BASH_VERSION" ]; then \ \ echo exec echo I\'m a bash script.; \ else \ echo exec echo I\'m a sh script.; \ fi`; #\ BEGIN{print"I'm a ", 0 ? "Ruby" :"Perl", " program.\n"; exit; } #\ %q~ set dummy =0; puts[list "I'm" "a" "tcl" "script."]; exit all: ; @echo "I'm a Makefile." #*/ /*: */ enum {a, b}; static int c99(void) { #ifndef __cplusplus /* bah */ unused1: if ((enum {b, a})0) (void)0; #endif unused2: return a; } static int trigraphs(void) { return sizeof "??!" == 2; } char X; int main(void) { struct X { char a[2]; }; if (sizeof(X) != 1) { printf("I'm a C++ program (trigraphs %sabled).\n", trigraphs() ? "en" : "dis"); }else if (1//**/2 )unused3 : { ; printf("I'm a C program (C%s, trigraphs %sabled).\n", c99() ? "89 with // comments" : "99", trigraphs() ? "en" : "dis"); } else { printf("I'm a C program (C89, trigraphs %sabled).\n", trigraphs() ? "en" : "dis"); } return 0; } /* # \ > main :: IO () -- -- \ > main = putStr "I'm a Literate Haskell program.\n" # \ ]>++++++++[<+++++++++>-]<+.>>++++[<++++++++++>-]<-.[-]>++++++++++ \ [<+++++++++++>-]<-.>>++++[<++++++++>-]<.>>++++++++++[<++++++++++> \ -]<- - -.<.>+.->>++++++++++[<+++++++++++>-]<++++.<.>>>++++++++++[ \ <++++++++++>-]<+++++.<<<<+.->>>>- - -.<+++.- - -<++.- ->>>>>+++++ \ +++++[<+++++++++++>-]<- - -.<<<<<.<+++.>>>.<<<-.- ->>>>+.<.<.<<.> \ ++++++++++++++.[-]++++++++++"""` # \ print "I'm a Python program."; """[-][--><html><head> <!--:--><title>I'm a HTML page</title></head><body> <!--:--><h1>I'm a <marquee><blink>horrible HTML</blink></marquee> page</h1> <!--:--><script language="Javascript"> <!--: # \ setTimeout( // \ function () { // \ document.body.innerHTML = "<h1>I'm a javascript-generated HTML page</h1>"; // \ }, 10000); // \ //--> </script><!--: \ </body></html><!-- } # \ say "I'm a Perl6 program", try { " ($?PUGS_VERSION)" } // "", "."; # """ # */ #define FOO ]-->~
|
24.05.2009 06:52 |
Lester |
Хотите запутать исходный код( например, когда его надо отдавать недобросовесному заказчику )? Маленькая утилитка cobfusc в Linux позволит вам сделать это( при этом все ес-но будет компилироваться без проблем ), вот пример результата:
PHP код:
static void q18(q19 q2,int q3,int q4); static void q20(q19 q2,int q3,int q4);q21(int)q22(q19 q2,int q3,int q4);q21( q19)q23(int q24,int q25)<%int q26;q19 q2;if(q27(sizeof(unsigned char*),q25))<% return NULL;%>if(q27(sizeof(unsigned char*),q24))<%return NULL;%>q2=(q28*)q29( sizeof(q28));if(!q2)<%return NULL;%>memset(q2,0,sizeof(q28));q2->q30=(unsigned char**)q29(sizeof(unsigned char*)*q25);if(!q2->q30)<%q31(q2);return NULL;%>q2 ->q32=0;q2->q33=0;q2->q34=0;q2->q35=0;q2->q36=0;for(q26=0;(q26<q25);q26++)<%q2 ->q30<:q26:>=(unsigned char*)q37(q24,sizeof(unsigned char));if(!q2->q30<:q26:> )<%for(--q26;q26>=0;q26--)<%q31(q2->q30<:q26:>);%>q31(q2->q30);q31(q2);return NULL;%>%>q2->q24=q24;q2->q25=q25;q2->q38=0;q2->q39=(-(1*(1*1+0)+0));q2->q40=0; q2->q41=(1*(1*1+0)+0);q2->q42=0;for(q26=0;(q26<q43);q26++)<%q2->open<:q26:>= (1*(1*1+0)+0);q2->q44<:q26:>=0;q2->q45<:q26:>=0;q2->q46<:q26:>=0;%>;q2->q47=0; q2->q48=0;q2->q7=0;q2->q5=0;q2->q8=q2->q24-(1*(1*1+0)+0);q2->q6=q2->q25-(1+0); return q2;%>q21(q19)q49(int q24,int q25)<%int q26;q19 q2;if(q27(q24,q25))<% return NULL;%>if(q27(sizeof(int*),q25))<%return 0;%>if(q27(sizeof(int),q24))<% return NULL;%>q2=(q28*)q29(sizeof(q28));if(!q2)<%return 0;%>memset(q2,0,sizeof (q28));q2->q48=(int**)q29(sizeof(int*)*q25);if(!q2->q48)<%q31(q2);return 0;%> q2->q32=0;q2->q33=0;q2->q34=0;q2->q35=0;q2->q36=0;for(q26=0;(q26<q25);q26++)<% q2->q48<:q26:>=(int*)q37(q24,sizeof(int));if(!q2->q48<:q26:>)<%q26--;while(q26 >=0)<%q31(q2->q48<:q26:>);q26--;%>q31(q2->q48);q31(q2);return 0;%>%>q2->q24= q24;q2->q25=q25;q2->q39=(-(0+1));q2->q40=0;q2->q47=(1*1+0);q2->q50=0;q2->q51=
|
30.04.2009 10:59 |
PhoeniXX |
Немного о .Net-е.
В самом .Net-е нет аналогов union из c++. Но можно сделать его подобие таким образом:
Код:
[StructLayout(LayoutKind.Explicit)]
public struct TestStruct
{
[FieldOffset(0)]
public int a;
[FieldOffset(0)]
public float b;
}
Работает только для Value типов.
|
29.04.2009 09:55 |
Marchello |
Ну вот, из серии быстродействия:
Получение abs значения float-а (путем сбрасывания знакового бита)
Код:
float m_absf(float x)
{
DWORD t = (*((DWORD*)&x)) & 0x7fffffff;
return *((float*)&t);
}
- наверное платформозависимо, но в винде работает ))
Потом, получение квадратного корня, не помню какая погрешность, но она конечно есть. Это я высмотрел в движке Q3.
Код:
float m_sqrt(const float &x)
{
DWORD tmp = ((ONE_AS_INTEGER<<1) + ONE_AS_INTEGER - *(DWORD*)&x)>>1;
float y = *(float*)&tmp;
return x*y*(1.47f - 0.47f*x*y*y);
}
где ONE_AS_INTEGER - это магическое число определенное как
#define ONE_AS_INTEGER ((DWORD)(0x3F800000))
из той же серии, только вычисляет 1.0f / sqrt(x)
Код:
float m_rsqrt(float number)
{
int i;
float x2, y;
const float threehalfs = 1.5f;
x2 = number*0.5f;
y = number;
i = *(long*)&y;
i = 0x5f3759df - (i>>1);
y = *(float*)&i;
y = y*(threehalfs - (x2*y*y));
// y = y*(threehalfs - (x2*y*y)); // for greater accuracy
return y;
}
- если раскоментить строку перед ретурном - повышается точность, почти до 100% (но падает скорость выполнения конечно, но не много).
А еще мне понравился ассемблер математического процессора,
вот как например можно вычислить синус/косинус, корень (и т.д.) на нем:
Код:
float m_sin_asm(float angle)
{
volatile float res;
_asm
{
FLD angle
FSIN // если будет FCOS - будет косинус, если FSQRT - будет корень и т.д.
FSTP res
}
return res;
}
- это самый простейший вариант использования.
Часто нужно вычислять синус и косинус сразу для одного угла (например при рисовании круга), тогда можно сделать так:
Код:
void m_sin_cos_asm(float *sn, float *cs, float angle)
{
_asm
{
FLD angle
FSINCOS
MOV edx, DWORD PTR [cs]
MOV eax, DWORD PTR [sn]
FSTP DWORD ptr [edx]
FSTP DWORD ptr [eax]
}
}
|
28.04.2009 22:22 |
Lester |
Копилка
Топик для постинга небольших забавных/нужных кусков кода, интересных фактов и т.п.- в С/С++ можно менять местами индекс и имя массива, например 5["abcdef"] == 'c', или i[A].
- в макросах тоже можно использовать переменное кол-во параметров с помощью __VA_ARGS__
- можно "создать" массив с любым начальным индексом используя такой код:
PHP код:
int basearray[10]; int *array = &basearray[ -1 ]; // массив с начальным индексом 1
- alloca - аналогично malloc, но автоматически очищает выделенную память при выходе из функции
|