Fra Hackers Delight: int hibit(unsigned int n) { n |= (n >> 1); n |= (n >> 2); n |= (n >> 4); n |= (n >> 8); n |= (n >> 16); return n - (n >> 1); } Denne version er til 32-bit ints, men logikken kan udvides til 64-bit eller højere.
LÆS++i vil øge værdien af i , og returner derefter den øgede værdi. i = 1; j = ++i; (i is 2, j is 2) i++ vil øge værdien af i , men returner den oprindelige værdi, i holdes, før den øges. i = 1; j = i++; (i is 2, j is 1) For en for sløjfe, enten virker. ++i synes mere almindeligt, mås
LÆSResumé:Nej. i++ kunne potentielt være langsommere end ++i , siden den gamle værdi af i skal muligvis gemmes til senere brug, men i praksis vil alle moderne compilere optimere dette væk. Vi kan demonstrere dette ved at se på koden for denne funktion, begge med ++i og i++ . $ cat i++.c extern void g
LÆSJeg bruger personligt Visual Leak Detector, selvom det kan forårsage store forsinkelser, når store blokke er lækket (den viser indholdet af hele den lækkede blok). Hvis du ikke ønsker at rekompilere (som Visual Leak Detector kræver) vil jeg anbefale WinDbg, som er både kraftfuld og hurtig (selvom
LÆSHurra for pointer! Denne kode fungerer ved at se fremad 12 bits for hver byte og kopiere de korrekte bits fremad. 12 bit er den nederste halvdel (nybble) af den næste byte og den øverste halvdel af 2 bytes væk. unsigned char length = 10; unsigned char data[10] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x
LÆSNummer 2 bliver ofte citeret som værende den kloge måde at gøre det på. Det er faktisk højst sandsynligt langsommere, da det slører programmørens eksplicitte mål - at bytte to variable. Dette betyder, at en compiler ikke kan optimere den til at bruge den faktiske assembler-ops til at bytte. Det foru
LÆSSammendrag: int a[17]; size_t n = sizeof(a)/sizeof(a[0]); Fuldstændig svar: For at bestemme størrelsen af dit array i bytes, kan du bruge sizeof operatør: int a[17]; size_t n = sizeof(a); På min computer er ints 4 byte lange, så n er 68. For at bestemme antallet af elementer i arrayet kan
LÆSEn ting at huske er, at Matlab-kompileren faktisk ikke kompilerer Matlab-koden til native maskininstruktioner. Det pakker det simpelthen ind i en selvstændig eksekverbar fil eller et bibliotek med sin egen runtime-motor, der kører den. Du ville være i stand til at køre din kode uden Matlab installer
LÆSEn god oversigt er tilgængelig i Implementation Strategies for First-Class Continuations, en artikel af Clinger, Hartheimer og Ost. Jeg anbefaler at se på Chez Schemes implementering i særdeleshed. Stakkopiering er ikke så komplekst, og der findes en række velforståede teknikker til at forbedre yde
LÆSNår du skifter til venstre, er der ingen forskel mellem aritmetisk og logisk skift. Når du skifter til højre, afhænger skifttypen af typen af værdien, der skiftes. (Som baggrund for de læsere, der ikke er bekendt med forskellen, flytter et logisk højreskift med 1 bit alle bit til højre og udfyl
LÆSHmm, okay. Jeg vil foreslå kode som denne, så: typedef struct { int type; int result; } DialogData; static gboolean display_dialog(gpointer user_data) { DialogData *dialog_data = user_data; GtkWidget *dialog; if (dialog_data->type & MB_YESNO) dialog = gtk
LÆSPortMidi er et andet open source-MIDI I/O-bibliotek på tværs af platforme, der er værd at tjekke ud. På den anden side, hvis du arbejder på en sysex-app, så fungerer direkte Win32 nemt nok. Er lige stødt på en anden open source-ramme på tværs af platforme, der inkluderer MIDI-understøttelse:Juce.
LÆS(signeret 16-bit little endian, 8000Hz mono (--format=S16_LE )) Musik Meget bedre end før! (selvom den er ret lang) main(t){for(;;t++)putchar(((7&(((t>>17)+1)>>2)+((t>>10)&1+2*(t>>18&1))*((23468643[7&t>>12]-48)+(3&t>>11))+((3&t>>17)
LÆSFortran IV: 2=0 Efter dette er hver konstant 2 i programmet nul. Tro mig, jeg har gjort dette (ok, for 25 år siden) Dette ser ud til at virke: #define x 2|0 Grundlæggende er udtrykket udvidet til (2|0 == 2|(0+2)) . Det er et godt eksempel på, hvorfor man bør bruge parenteser, når man definerer
LÆSC (90) (79) (59) (47) (42) (40) statisk int x=1;a(){char b[8];printf(%d\n,x++);b[24]-=5*(1-x/101);}main(){a();return 0;} Funktionen a som udskriver tallene kalder ikke sig selv! Jeg udnyttede et bufferoverløb og ændrede returadressen for at få programtælleren til at gå over funktion a igen, så
LÆS235 I det væsentlige baseret på indmaden fra SoniEx2s 239-svar. local o,k,F=type,next,{}for n=0,2 do F[n]=function(a,r,t,G)if n<1 or o{}~=o(a)then return a end t={}r=r or{}r[a]=n<2 and t G=F[n%2]for x,y in k,a do t[r[x]or G(x,r)]=r[y]or G(y,r)end return t end end table.copy={shallow=F[2],deep
LÆS90 bytes Hvis vi kan bruge stdio , hvorfor ikke bruge dets formateringsmuligheder til at udføre sammenligning? main(a,b){scanf(%d%d,&a,&b);snprintf(&a,2,%d,b-a);a&=63;putchar(51-!(a-45)-!!(a-48));} Forudsætter ASCII-kompatibel kodning og lille endianness. 72 bytes Kvotienter afru
LÆSVim, 54, 52, 49 47 tastetryk 2wa0<esc>qqYp<c-a>6ldf @[email protected]$dT]dd:%norm dwf{xwC;<CR>gg0P Forklaring: 2wa0<esc> Move 2 words forward, and insert a 0. qq Start recording in register Q Yp D
LÆSHaskell, 327 360 418 394 bytes g.(m.w.r.r=<<).lines.f n:c:z=\n#_0123456789++[A..Z]++[a..z] (!)x=elem x f(\\:\n:a)=f a f(a:b)=a:f b f a=a m(#:a)=c:a++[n] m a=a g(a:#:b)=a:[n|a/=n]++c:g b g(a:b)=a:g b g a=a s=span(! \t) r=reverse.snd.s l n(a:b)d|a==d,n=a:w(snd$s b)|1>0=a:l(not$n&&a==\
LÆSRetina 0.8.2, 60 59 bytes i`^(0[0-7]*|0x[\da-f]+|[1-9]\d*)(u)?(l)?(?-i:\3?)(?(2)|u?)$ Prøv det online! Linket inkluderer testcases. Rediger:Gemt 1 byte takket være @FryAmTheEggMan. Forklaring: i` Match uafhængigt af store og små bogstaver. ^(0[0-7]*|0x[\da-f]+|[1-9]\d*) Start med enten oktal,
LÆS