tests/consistency.R

library(bitops)

i7 <- 0:127
ri7 <- bitFlip(i7)
stopifnot(identical(bitAnd(i7,ri7), rep(0,length(i7))),
          ri7+i7 == 2^32-1,
          ## flipping the bits twice should be the identity (modulo overflow):
          identical(i7, as.integer(bitFlip(ri7))),
          bitAnd(i7, ri7) == 0,
          ##
          bitAnd(15,17) ==  1,
          bitOr (15,17) == 31,
          bitXor(15,17) == 30
          )

IMAX <- 2^31-1
set.seed(1959)
system.time( for(N in 1:5000) {
    if(N %% 20 == 0)
        i7 <- sample.int(IMAX, size=128)
    j7 <- sample(i7)
    stopifnot(exprs = {
        ## Commutative Law:
        identical(bitOr (i7, j7), bitOr (j7, i7))
        identical(bitAnd(i7, j7), bitAnd(j7, i7))
        identical(bitXor(i7, j7), bitXor(j7, i7))
        ## Xor "+" And  == Or :
        identical(bitOr(i7, j7),
                  bitOr(bitXor(i7,j7), bitAnd(i7,j7)))
        ## Logic:  !(A & B)  <->  (!A) | (!B)
        identical(bitFlip(bitAnd(i7, j7)),
                  bitOr(bitFlip(i7), bitFlip(j7)))
        ##         !(A | B)  <->  (!A) & (!B)
        identical(bitFlip(bitOr(i7, j7)),
                  bitAnd(bitFlip(i7), bitFlip(j7)))
        ##
        ## Associative Law:
        length(k7 <- sample(j7)) == length(j7)
        identical(bitOr(bitOr(i7, j7), k7),
                  bitOr(i7, bitOr(j7, k7)))
        identical(bitAnd(bitAnd(i7, j7), k7),
                  bitAnd(i7, bitAnd(j7, k7)))
        identical(bitXor(bitXor(i7, j7), k7),
                  bitXor(i7, bitXor(j7, k7)))
    })
} ) # ..time

### Verify cksum()  -------------------------------

CHR <- " !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~"
rotCh <- vapply(seq_len(nchar(CHR)), function(i)
                 paste0(substring(CHR, i), substr(CHR, 1,i-1L), collapse = ""), "")
cSums <-
    c(2442416856, 1669542993, 313999433, 178729808, 3394733963, 2164389741,
        3871734349, 3789449038, 40636212, 1452746146, 541480198,
        2979936832, 2923782422, 792265197, 3640409291, 1202696403,
        4011398543, 2699207183, 2985612474, 1439186030, 1508213684,
        1865388774, 2380454843, 454855490, 1019166481, 924244674,
        1406204380, 2429078660, 1046223291, 1230078089, 1548993556,
        280855472, 421066716, 2967223269, 1100914587, 886676022,
        1657109189, 843923270, 620178494, 1609552402, 1787171819,
        4006198310, 1023859819, 1411671880, 513493423, 2495633464,
        1866449535, 4291277827, 3301230818, 381214501, 2497598429,
        675736398, 3735311659, 2170409126, 3731386467, 1015853879,
        4060922207, 1023658490, 2980477601, 350747207, 2650042644,
        600967562, 4254175774, 1970787970, 4065204194, 1521286262,
        3589949651, 879070207, 1152896007, 2418807455, 2666637124,
        2577590065, 4208759298, 3274144307, 1957580223, 3095930811,
        3625810032, 126832280, 1912362968, 515865842, 3876027886,
        304043927, 785523686, 3840974701, 2587165204, 1710947718,
        2356035548, 430213333, 3484582166, 885948210, 1348073033,
        2652440189)

stopifnot(identical(cksum(rotCh), cSums))

## verify bit shifts:
stopifnot(
    identical(2^(0:31), bitShiftL(1,   0:31)),
    identical(2^(31:0), bitShiftR(2^31,0:31))
)

# test boundary value behavior:  +/- Inf, NA, NaN, 2^32:

a <- round(runif(500)*2^33)
b <- which(a < 4294967296)
##
stopifnot(exprs = {
    is.na(bitAnd(a,a)[-b])
    identical(bitAnd(a,a)[b], a[b])
    is.na(bitOr(a,a)[-b])
    identical(bitOr(a,a)[b], a[b])
    is.na(bitXor(a,0)[-b])
    identical(bitXor(a,0)[b], a[b])
    is.na(bitXor(0,a)[-b])
    identical(bitXor(0,a)[b], a[b])
    is.na(bitFlip(bitFlip(a))[-b])
    identical(bitFlip(bitFlip(a))[b], bitAnd(a,2^32-1)[b])
    is.na(bitShiftR(a,runif(10)*32)[-b])
    is.na(bitShiftL(a,runif(10)*32)[-b])
})

a[-b] <- 1/0
stopifnot(exprs = {
    is.na(bitAnd(a,a)[-b])
    identical(bitAnd(a,a)[b], a[b])
    is.na(bitOr(a,a)[-b])
    identical(bitOr(a,a)[b], a[b])
    is.na(bitXor(a,0)[-b])
    identical(bitXor(a,0)[b], a[b])
    is.na(bitXor(0,a)[-b])
    identical(bitXor(0,a)[b], a[b])
    is.na(bitFlip(bitFlip(a))[-b])
    identical(bitFlip(bitFlip(a))[b], bitAnd(a,2^32-1)[b])
    is.na(bitShiftR(a,runif(10)*32)[-b])
    is.na(bitShiftL(a,runif(10)*32)[-b])
})

a[-b] <- -1/0
stopifnot(exprs = {
    is.na(bitAnd(a,a)[-b])
    identical(bitAnd(a,a)[b], a[b])
    is.na(bitOr(a,a)[-b])
    identical(bitOr(a,a)[b], a[b])
    is.na(bitXor(a,0)[-b])
    identical(bitXor(a,0)[b], a[b])
    is.na(bitXor(0,a)[-b])
    identical(bitXor(0,a)[b], a[b])
    is.na(bitFlip(bitFlip(a))[-b])
    identical(bitFlip(bitFlip(a))[b], bitAnd(a,2^32-1)[b])
    is.na(bitShiftR(a,runif(10)*32)[-b])
    is.na(bitShiftL(a,runif(10)*32)[-b])
})

a[-b] <- suppressWarnings(sqrt(-1))
stopifnot(exprs = {
    is.na(bitAnd(a,a)[-b])
    identical(bitAnd(a,a)[b], a[b])
    is.na(bitOr(a,a)[-b])
    identical(bitOr(a,a)[b], a[b])
    is.na(bitXor(a,0)[-b])
    identical(bitXor(a,0)[b], a[b])
    is.na(bitXor(0,a)[-b])
    identical(bitXor(0,a)[b], a[b])
    is.na(bitFlip(bitFlip(a))[-b])
    identical(bitFlip(bitFlip(a))[b], bitAnd(a,2^32-1)[b])
    is.na(bitShiftR(a, runif(10)*32)[-b])
    is.na(bitShiftL(a, runif(10)*32)[-b])
})

a[-b] <- NA
stopifnot(exprs = {
    is.na(bitAnd(a,a)[-b])
    identical(bitAnd(a,a)[b], a[b])
    is.na(bitOr(a,a)[-b])
    identical(bitOr(a,a)[b], a[b])
    is.na(bitXor(a,0)[-b])
    identical(bitXor(a,0)[b], a[b])
    is.na(bitXor(0,a)[-b])
    identical(bitXor(0,a)[b], a[b])
    is.na(bitFlip(bitFlip(a))[-b])
    identical(bitFlip(bitFlip(a))[b], bitAnd(a,2^32-1)[b])
    is.na(bitShiftR(a, runif(10)*32)[-b])
    is.na(bitShiftL(a, runif(10)*32)[-b])
})

Try the bitops package in your browser

Any scripts or data that you put into this service are public.

bitops documentation built on April 24, 2021, 5:07 p.m.