[ 
https://issues.apache.org/jira/browse/LANG-1627?focusedWorklogId=788017&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-788017
 ]

ASF GitHub Bot logged work on LANG-1627:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 05/Jul/22 19:05
            Start Date: 05/Jul/22 19:05
    Worklog Time Spent: 10m 
      Work Description: garydgregory commented on PR #890:
URL: https://github.com/apache/commons-lang/pull/890#issuecomment-1175402822

   Closing: I brought this in slightly differently, using `oneHot()` instead of 
`xorOneHot` and other minor changes; please see git master.




Issue Time Tracking
-------------------

    Worklog Id:     (was: 788017)
    Time Spent: 1.5h  (was: 1h 20m)

> BooleanUtils.xor not behaving as expected with any odd number of true's
> -----------------------------------------------------------------------
>
>                 Key: LANG-1627
>                 URL: https://issues.apache.org/jira/browse/LANG-1627
>             Project: Commons Lang
>          Issue Type: Bug
>    Affects Versions: 3.11
>            Reporter: Alberto Scotto
>            Priority: Major
>          Time Spent: 1.5h
>  Remaining Estimate: 0h
>
> Hi,
> I was expecting a xor function that takes a variable number of arguments to 
> *return true if and only if exactly one among all of the arguments is true*, 
> regardless of the number of arguments.
> This holds true given three false's:
> {code:java}
> @Test
> public void threeFalse() {
>  boolean[] bools = new boolean[]{Boolean.FALSE, Boolean.FALSE, Boolean.FALSE};
>  assertFalse(BooleanUtils.xor(bools));
> }{code}
>  
>  It also holds true given 4 true's, as well as for any even number of trues.
> {code:java}
>     @Test
>     public void fourTrue() {
>         boolean[] bools = new boolean[]{Boolean.TRUE, Boolean.TRUE, 
> Boolean.TRUE, Boolean.TRUE};
>         assertFalse(BooleanUtils.xor(bools));
>     }
> {code}
> The above tests pass.
> But with any odd number of true's that doesn't hold anymore:
>  
> {code:java}
> @Test
> public void threeTrue() {
>  boolean[] bools = new boolean[]{Boolean.TRUE, Boolean.TRUE, Boolean.TRUE};
>  assertFalse(BooleanUtils.xor(bools));
> }
> {code}
> This test fails.
> That was totally unexpected to me.
>  But as it turns out, even
> {noformat}
> true ^ true ^ true{noformat}
> evaluates to true. That was unexpected too to me, at a first sight.
> The thing is that xor (I mean the original boolean operator) is a binary 
> operator, so if you want to make it n-ary, one simple solution is to apply it 
> in two by two: ((a ^ b) ^ c) ^ d
>  And that's what is done in the implementation of the method BooleanUtils#xor.
> But that brings to BooleanUtils.xor(true, true, true) == true, and at the 
> same time BooleanUtils.xor(true, true, true, true) == false, which just 
> doesn't sound right to me.
> Whether or not you agree with me that that is a bug of the method, please at 
> least update the Javadoc, because right now it is not providing the user 
> enough information. Look:
> {code:java}
> Performs an xor on a set of booleans.
>          BooleanUtils.xor(true, true)   = false
>          BooleanUtils.xor(false, false) = false
>          BooleanUtils.xor(true, false)  = true
> {code}
>  
> Thanks.
> Cheers



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to