国外最火的网站,深入浅出wordpress下载,wordpress背景飘带,网站服务合同交印花税吗190. Reverse Bits#xff08;颠倒二进制位#xff09;
题目要求我们将一个数的二进制位进行颠倒#xff0c;画出图示如下(以8位二进制为例)#xff1a; 显然对于这种问题我们需要用到位操作#xff0c;我们需要将原数的每一位取出来然后颠倒之后放进另一个数。 我们需要…190. Reverse Bits颠倒二进制位
题目要求我们将一个数的二进制位进行颠倒画出图示如下(以8位二进制为例) 显然对于这种问题我们需要用到位操作我们需要将原数的每一位取出来然后颠倒之后放进另一个数。 我们需要先知道离散数学中的几个公式 p ∨ 1 1 p ∨ 0 p p ∧ 1 p p ∧ 0 0 p\lor 1 1\\p\lor 0p\\p\land 1 p\\p\land 0 0 p∨11p∨0pp∧1pp∧00 知道上述的公式之后我们就可以对数进行取出位数。 如下图所示
也就是说我们要取出哪一位就让哪一位上1就行了。 但是如何控制对应位为1而其他位为0呢我们知道c语言中移位操作与,分别代表左移与右移让对应位为1我们只需要让1进行操作就行。 经过移位与操作我们可以得到一个除了要取出位为原二进制数中对应位之外其余位全为0的数。 现在取出哪一位的问题已经解决了我们知道 p ∨ 0 p p\lor0p p∨0p也就是说我们要保证接收对应位的数的对应位等于0其余的均不许要进行改变因为我们取出数的位除了取出的那一位其余位全为0并不会改变我们的接收数。由此我们有了以下的思路。 因为有符号整型的数在进行移位操作的时候并不能操作符号位所以我们需要先进行符号位的改变。或者使用无符号整型。
uint32_t reverseBits(uint32_t n) {int x 0;if(n%20){x 0;}else{x INT_MIN;}for(int i 0; i31; i){n n1;x | ((n1)(30-i));}return x;
}运行结果截图:
191. Number of 1 Bits( 位1的个数)
经过上面这一题之后我们已经知道怎么取出对应位了取出对应位之后判断是否为1就行了。
int hammingWeight(uint32_t n) {int count 0;while(n){if(n1){count; }nn1;}return count;
}运行结果截图: