[关闭]
@LIUHUAN 2019-12-31T22:41:41.000000Z 字数 1339 阅读 736

二进制相关

algorithm


翻转二进制位

  1. uint32_t reverseBits(uint32_t n) {
  2. if (n == 0)
  3. return n;
  4. const int N = 32;
  5. uint32_t r = 0,i,j=0;
  6. while(n) {
  7. i = n&1; // 获取最后一位数字,0,1 类似n%2
  8. r <<= 1; // 左移扩大
  9. r |= i;// 类似十进制的 r += i
  10. j++;
  11. n>>=1;// 右移,除以2,倒数第二位变成倒数第一位
  12. }
  13. return r << (N-j);// 剩下的位数左移
  14. }

优化方法

  1. uint32_t reverseBits(uint32_t n) {
  2. n = (n >> 16) | (n << 16); // 交换低16位和高16位
  3. n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);// 交换低8位和高8位
  4. n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);// 交换低4位和高4位
  5. n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);// 交换低2位和高2位
  6. n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);// 交换低1位和高1位
  7. return n;
  8. }

备注

  1. int reverse(int n){
  2. while(n) {
  3. x = n %10;
  4. n/=10;
  5. }
  6. }

翻转十进制位数

  1. int reverse(int x) {
  2. if(x == INT_MIN) // 最小值特殊case
  3. return 0;
  4. int a = abs(x);
  5. int z = 0;
  6. while(a) {
  7. if(overflow(z)) // 溢出判断
  8. return 0;
  9. z *=10;
  10. z += a%10;
  11. a /=10;
  12. }
  13. return x >0 ? z:-z;
  14. }
  15. // 溢出判断
  16. int overflow(int z) {
  17. return z > INT_MAX/10 ||(z == INT_MAX/10 && a%10 > INT_MAX%10) // 溢出判断
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注