bitXor
这题用限定的操作来表示异或这个操作
a ^ b = (a | ~b) &(~a & b)
运用离散数学的基本知识可以推出用 & 和 ~表示的方案
int bitXor(int x, int y) {
return ~(a & b) & ~(~a & ~b);
}
返回最小的二进制数的补码方式(8位)
比较好想补码第一位取符号所以第一位肯定取一后面取0
int tmin(void) {
return 1 << 31;
}
isTmax (如果是最大的数返回1其他返回0)
利用Tmax的性质 加一取反是本身
最大的数字是011111 加一取反为011111 变回原来的 两者异或为0
特殊情况就是111111 加以取反为111111 特判这个数字这个数字加一为0
int isTmax(int x) {
// 最大的数字是0111111 这个数字加1变成100000 取反加1变成011111 两者异或为0 特殊情况是111111 加1取反变成111111 这个数取反为0和0特判
return (!(~(x + 1) ^ x) & !!(x + 1)); //用!!来标准化
}
allOddBits 如果所有的奇数为1就返回1
如果能构造一个数所有的奇数位为1 其余为0就好办了 因为这样如果是符合条件的数字两者 & 还是 构造的数字 用^来判断=就行 1010 就是这样一个数字;利用二分来递增这个数字
int allOddBits(int x) {
int A = 0xA;
int AA = (A << 4) ^ A; //8位
int AAA = (AA << 8) ^ AA;//16位
int maxx = (AAA << 16) ^ AAA;//32位
return !((x & maxx) ^ maxx);
}
negate 将一个数字取它的负数
int negate(int x) {
return ~x + 1;
}
isAsciiDigit 如果一个数字在一个区间内就返回 1 否则返回 0
int isAsciiDigit(int x) {
// 如果这个数在0x30 到 0x39 之间就返回 1 其他就返回 0
// return 2;
//110000 到 111001;
// 前面必须是0的形式 把后面不是 0 的通过右移去掉之后必须是0
int cod1 = !(x >> 6);
//必须是 11 这种形式
int cod2 = !((x >> 4) ^ 0b11);
//后四位必须在0000 到 1001这个范围之内 0xA 是 1010
int c = x & 0xF;
int cod3 = !!((c - 0xA) >> 31);
return cod1 & cod2 & cod3;
}
conditional
int conditional(int x, int y, int z) {
// 如果 x 不是 0 就返回 y 否则返回 z;
int cod = ((!!x) << 31) >> 31;// 一定要让该数字与x有关
如果是 0 操作过后还是 0000000....(共计32位)
如果是 1 操作过后就是 1111111....(共计32位)
return (cod & y) | (~cod & z);
}