All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: "AreaZR via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, "Dragan Simic" <dsimic@manjaro.org>,
	"Jeff King" <peff@peff.net>, "René Scharfe" <l.s.r@web.de>,
	"Phillip Wood" <phillip.wood123@gmail.com>,
	AreaZR <gfunni234@gmail.com>,
	"Seija Kijin" <doremylover123@gmail.com>
Subject: Re: [PATCH v3] git: use ^=1 to toggle between 0 and 1
Date: Wed, 18 Dec 2024 07:46:07 -0800	[thread overview]
Message-ID: <xmqq4j31t2o0.fsf@gitster.g> (raw)
In-Reply-To: <pull.1620.v3.git.git.1734482536998.gitgitgadget@gmail.com> (AreaZR via GitGitGadget's message of "Wed, 18 Dec 2024 00:42:16 +0000")

"AreaZR via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: Seija Kijin <doremylover123@gmail.com>
>
> If it is known that an int is either 1 or 0,
> doing an exclusive or to switch instead of a
> modulus makes more sense and is more efficient.

FWIW, it is much more idiomatic in this codebase to say

	foo = !foo;

to flip the polarity of foo when foo is used as a Boolean.  It is
both more readable than toggling only the bottom bit, and it is much
more robust.  Here 'used as a Boolean' means 'is it zero, or is it
non-zero?', the norm used in the C language.

If the reference to "foo", other than the place where the value of
foo is consulted for the sole purpose of fliping between true-false,
were to check if it is true or not, i.e.

	if (foo)
		do something;
	else
		do something else;

then at this "real" use site, only the zero-ness of the value
matters.  foo==0 does something different from foo==1, but the code
behaves the same way as the case where foo==1, if foo==2 or foo==3.

But the code that flips by

	foo = 1 - foo;
	foo ^= 1;

makes an assumption different from and stricter than the real use
site.  It only allows foo==0 and foo==1 without a good reason.

But

	foo = !foo;

keeps the same assumption as the real use site, which is why we
prefer that form.

And like it or not, it is natural to assume that 0 is false and
everything else is true when writing in C, and especially in the
codebase of this project.  So let's not flip

	foo = !foo;

into

	foo ^= 1;

just to make it look different.  Going the other way, or rewriting
rewriting modulo 2 arithmetic into !foo form, would be more
preferrable.

The "flipped_block" is used like so:

	if (flipped_block && o->color_moved != COLOR_MOVED_BLOCKS)
		set MOVED_LINE_ALT bit in flags word;

so it is very much Boolean whose zero-ness matters.


      parent reply	other threads:[~2024-12-18 15:46 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-12 17:17 [PATCH] Use ^=1 to toggle between 0 and 1 AtariDreams via GitGitGadget
2023-12-12 17:29 ` Dragan Simic
2023-12-12 20:09 ` Jeff King
2023-12-12 22:30   ` René Scharfe
2023-12-13  8:01     ` Jeff King
2023-12-13 15:17       ` Junio C Hamano
2023-12-14 13:08       ` René Scharfe
2023-12-14 22:05         ` Jeff King
2023-12-15 14:46           ` Phillip Wood
2023-12-15 17:09             ` Junio C Hamano
2023-12-16 10:46               ` René Scharfe
2023-12-18 16:18               ` Phillip Wood
2023-12-16 10:47             ` [PATCH] git-compat-util: convert skip_{prefix,suffix}{,_mem} to bool René Scharfe
2023-12-18 16:23               ` Phillip Wood
2023-12-18 20:19                 ` Junio C Hamano
2023-12-19 13:36                   ` René Scharfe
2023-12-21  9:59               ` Jeff King
2023-12-21  9:56             ` [PATCH] Use ^=1 to toggle between 0 and 1 Jeff King
2023-12-21 15:06               ` phillip.wood123
2024-12-18  0:16 ` [PATCH v2] " AreaZR via GitGitGadget
2024-12-18  0:42   ` [PATCH v3] git: use " AreaZR via GitGitGadget
2024-12-18  2:38     ` [PATCH v4] " AreaZR via GitGitGadget
2024-12-18 16:46       ` [PATCH v5] " AreaZR via GitGitGadget
2024-12-18 16:57         ` [PATCH v6] git: use logical-not operator " AreaZR via GitGitGadget
2024-12-19 10:35           ` Junio C Hamano
2024-12-18 15:46     ` Junio C Hamano [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqq4j31t2o0.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=doremylover123@gmail.com \
    --cc=dsimic@manjaro.org \
    --cc=gfunni234@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=l.s.r@web.de \
    --cc=peff@peff.net \
    --cc=phillip.wood123@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.