1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
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])
})
|