按位操作符只能用于整数基本数据类型中的单个bit中,操作符对应表格:
Operator | Description |
& | 按位与(12345&1=1,可用于判断整数的奇偶性) |
| | 按位或 |
^ | 异或(同假异真) |
~ | 非(一元操作符) |
&=,|=,^= | 合并运算和赋值 |
<<N | 左移N位,低位补0 |
>>N | 右移N位,(正数:高位补0,负数高位补1) |
>>>N | 无符号右移(无论正负数,高位皆补0) |
<<=,>>=,>>>= | 合并运算和赋值(移动相应位数再赋值给左边变量) |
leetcode191:
Write a function that takes an unsigned integer and returns the number of ’1′ bits it has (also known as the Hamming weight).
For example, the 32-bit integer ’11′ has binary representation 00000000000000000000000000001011
, so the function should return 3.
值得注意的是我们要将传入的int n作为无符号整数看待,但是在java中int是有符号的,我想到的方法就是利用上面的>>>无符号移位操作,代码如下:
public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int num = 0; do{ if((n & 1) == 1) num++; }while((n>>>=1) > 0); return num; } public static void main(String[] args){ System.out.println((new Solution()).hammingWeight(11)); } }
leetcode190:
Reverse bits of a given 32 bits unsigned integer.
For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as00111001011110000010100101000000).
Follow up:
If this function is called many times, how would you optimize it?
二进制的倒置可以用移位来进行,增加运算效率
1 public int reverseBits(int n) { 2 int rs = 0; 3 for (int i = 0; i < 32; i++) { 4 rs = (rs << 1) + (n & 1); 5 n >>= 1; 6 } 7 return rs; 8 }
leetcode7:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
十进制的倒置同样值得注意的就是倒置以后溢出的问题,我采用的方法就是函数内利用Long类型来进行计算,并在转换成int前与intMax进行比较,如果溢出返回0(题目要求)
1 public int reverse(int x) { 2 long l = new Long(x); 3 Long tmp = 0L; 4 while (l != 0) { 5 tmp = tmp * 10 + l % 10L; 6 l /= 10; 7 } 8 if (x > 0 && tmp > 2147483647L || x < 0 && tmp < -2147483648) 9 return 0; 10 return tmp.intValue(); 11 }
想到了新的解法再更新