From a91f4d1ad6b5389617f8941e70face69ad94dfda Mon Sep 17 00:00:00 2001 From: zlg Date: Sat, 6 Apr 2013 04:14:36 -0500 Subject: Solve Exercise 2-9: bitcount() --- ch2/2-09_bitcount.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 ch2/2-09_bitcount.c (limited to 'ch2') diff --git a/ch2/2-09_bitcount.c b/ch2/2-09_bitcount.c new file mode 100644 index 0000000..d824ca6 --- /dev/null +++ b/ch2/2-09_bitcount.c @@ -0,0 +1,43 @@ +#include + +/* The C Programming Language: 2nd Edition + * + * Exercise 2-9: In a two's complement number system, x &= (x-1) deletes + * the rightmost 1-bit in x. Explain why. Use this observation to write a + * faster version of bitcount. + * + * Answer: Subtracting 1 from a number reverses the rightmost 1 bit and + * replaces all lower-order bits to 0. So for example: + * + * 110100 (52) minus 1 is + * 110011 (51) + * + * The & operator only masks bits off (makes them zero) if that bit in the + * second operand is also zero. That means... + * + * 110100 (52) & + * 110011 (51) is + * 110000 + * + * Why? Because the 2nd operand (51) is only masking off two fields, the 3rd + * and 4th (which are zeros). The rightmost 1-bit in the 1st operand (52) is + * in that mask, so it goes poof. + */ + +unsigned bitcount(unsigned x) { + int count = 0; + while (x != 0) { + x &= (x - 1); + count++; + } + return count; +} + +int main() { + int i; + unsigned test[4] = { 51, 65535, 256, 10834 }; + for (i = 0; i < 4; i++) { + printf("%6u has %2d ones in its binary representation.\n", test[i], bitcount(test[i])); + } + return 0; +} -- cgit v1.2.3-54-g00ecf 40b&follow=1'>commitdiff
AgeCommit message (Collapse)AuthorFilesLines
2025-07-29README.md: Better clarify dates, add contact detailszlg1-7/+19
2025-07-29README.md: Remove references to -w flag to 'list' commandzlg1-2/+2
2025-07-28Update build system, release 0.3beta8v0.3b8zlg3-6/+6
Target Python version is now 3.13, and built with `python -m build`.
2025-07-27README.md: update to include mentions of *_date fieldszlg1-7/+26
2025-07-27Finish integrating support for p_date, et alzlg2-23/+59
* Tightened up update_game() to use explicit fields * 'unowned' and 'unbeatable' status now show as blank fields in list_game() output * Results are counted and a proper message is emitted instead of erroring when there are no results. * Support p_date, b_date, and c_date in the CLI
2025-01-24Add support for p_date, b_date, c_date to CLIzlg2-48/+136
The library and CLI tool both can handle the new schema v2 that includes these columns. Please use the schema migration script in the "scripts" directory to continue using VGStash. The list_games function has been completely re-worked to handle arbitrary tabular data. Raw mode has remained, but the width switch (-w) for default table view is no longer present. The first VIEW supporting these columns is also available in FILTERS: the backlog_age filter, which will show you the amount of time games with a purchase date value have been sitting in your collection unbeaten.
2025-01-24tox.ini: Update to Python 3.11 env by defaultzlg1-1/+1
2025-01-23schema1-to-2.py: Add shebang because I'm a doofuszlg1-0/+2
2023-09-22scripts: Add schema v1->v2 migration scriptzlg2-9/+85
This script adds three columns to the schema, supporting the "Purchased", "Beaten", and "Completed" note headers. They are now converted to a UNIX timestamp and stored in a separate column so queries made against that metadata are easier. The library itself still needs to support all the new columns.