Prepare for the winners of **IOCCC28**. > However these are not the 2024 droids you are looking for. :-) The HTML menu (both JavaScript and non-JavaScript) has been updated. The `Status -> Rules and guidelines' have been replaced with two separate menus `Status -> IOCCC rules` and `Status -> IOCCC guidelines`. Added a new top level `social.html` page: built from a new `social.md`. Sorted rules for building specific web pages in the top level `Makefile`. Added `make social` to make the `social.html` page from `social.md`. The `bin/gen-top-html.sh` now is able to process a argument of **social** to process the new top level `social.html` page. Changed `bin/gen-top-html.sh` VERSION from "2.0.0 2025-03-13" to "2.0.1 2025-07-25". Below `About -> Home page` a new `About -> IOCCC social media` menu item as added. Because the menu change touched every HTML file, we changed the general copyright date range for HTML files from "1984-2024" to "1984-2025" due to the extensive changes made for **IOCCC28**. Those markdown files that were modified in 2025 had their copyright date range also changed from "1984-2024" to "1984-2025". Rebuilt tarballs and sitemap due to the extensive HTML rebuilding. Ran `make update` to perform the above.
To build:
make
Bugs and (Mis)features:
The current status of this entry is:
STATUS: INABIAF - please DO NOT fix
For more detailed information see 2020/burton in bugs.html.
To use:
./prog arg ...
Try:
./try.sh
Alternate code:
By default, the program works for Little Endian machines. This alternate build is for Big Endian machines (that works whether you have LE or BE).
Alternate build:
Running make builds the alternate code by default.
Alternate use:
Use prog_be as you would prog above.
Judges' remarks:
Can you determine why this shows strange output for ./prog 128 128
and ./prog 128 128 128 128 but not ./prog 128 128 128?
Can you find a pattern here?
What happens if you specify different numbers?
This tiny one-liner is a bit-twiddler's delight! It does all of the work without looping.
To understand how it works, a good place to start is to look at the hex
value that results when the two magic constants are XORed.
Once you've figured out what happens with one set of constants, how can choosing new constants, but using the same computation generate a reversed result?
This code may be tested by:
make test
Author's remarks:
Invoke this with a single non-negative integer less than 256, and a useful transformation occurs.
Rule 2-ish:
Exporting the constants B,I,T,S to the Makefile allows the
code to be compiled for either LE (little-endian) or BE (big-endian)
machines(!!), so they are truly configuration parameters, not logic.
Notes:
One ping argument only. It will segfault on zero arguments, and
display strange results with more than one argument.
Small, non-negative integers only. Useful range is 0 .. 511, sorta, for LE; 0 .. 255 for BE. Bonus points if you can explain why the limits work this way.
ASCII character set, 64-bit long longs are required.
v,a,r,i,a,b,l,e,s_NAME the operation.
No loops, no branches?!?
Compilation:
Compiles cleanly under clang -Wall -Weverything -pedantic, but you need to add
--include stdio.h --include stdlib.h for the printf(3) and atoi(3).
On a little-endian machine:
clang -include stdio.h -include stdlib.h -Wall -Weverything -pedantic -DB=6945503773712347754LL -DI=5859838231191962459LL -DT=0 -DS=7 -o prog prog.c
On a big-endian machine:
clang -include stdio.h -include stdlib.h -Wall -Weverything -pedantic -DB=7091606191627001958LL -DI=6006468689561538903LL -DT=1 -DS=0 -o prog_be prog.c
You might be interested to compile it both ways on the same host, and try:
./prog 1; ./prog_be 1