美文网首页
位操作不高效的时刻

位操作不高效的时刻

作者: hklbird | 来源:发表于2016-04-19 15:36 被阅读9次

题目:

<b>The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2] and Its gray code sequence is:(题目来自Leetcode中的GaryCode)</b>

00 - 0
01 - 1
11 - 3
10 - 2

my last coding :

public List<Integer> grayCode(int n) {
    List<Integer> res = new ArrayList<>();
    int bits = 1;
    res.add(0);
    for(int i=0;i<n;i++)
    {
        bits=1<<i;
        for(int j = res.size()-1;j>=0;j--){
            res.add(res.get(j)|bits);
        }
        
    }
    return res;
}

and it cost me 2ms running in leetcode.
Then the new version :

public List<Integer> grayCode(int n) {
    List<Integer> res = new ArrayList<>();
    int bits = 1;
    res.add(0);
    for(int i=0;i<n;i++)
    {
        bits=1<<i;
        for(int j = res.size()-1;j>=0;j--){
    // change here
            res.add(res.get(j)+bits);
        }
        
    }
    return res;
}

I just use plus instead of or operation,but the runtime now is 1ms.
So I search google to find that <b>mutiply and divide is slower than bit operation.</b>However,there is no files telling me about plus.
So I do the reacher below:

public static void main(String[] args) {
    int res1 = 1000;
    int res2 = 1000;
    int component = 1<<4;
    long startTime1 = System.currentTimeMillis();
    for(long i=0;i<1000000L;i++)
        res1 = res1|component;
    long endTime1 = System.currentTimeMillis();
    long startTime2 = System.currentTimeMillis();
    for(long i=0;i<1000000L;i++)
        res2 = res2+component;
    long endTime2 = System.currentTimeMillis();
    long cost1 = endTime1-startTime1;
    long cost2 = endTime2-startTime2;
    System.out.println("| :"+ (cost1));
    System.out.println("+ :"+cost2);
}

<b>| cost 3ms,but + costs 1ms; We can see | is better than +.</b>
Furthermore,when execution is morethan 100000000,the excution time is nearly the same.
At last ,I draw a conclusion that we use + better.

相关文章

  • 位操作不高效的时刻

    题目: The gray code is a binary numeral system where two su...

  • 高效bit 位经典操作

    奇偶判断只需要判断数字的最后一个比特位是0 还是 1, 只要最后一位为0 都可以表示成 x*2 即 x<<1bo...

  • 高效时刻

    2106年5月3号 骑行37公里,耗时2小时38分 大汗 心情极好,效率极高。思路特别清晰。 原因待查:1可能是回...

  • 高效代码之按位操作(一)

    不管程序猿喜不喜欢写代码,只要写了,就应该想办法让自己的程序尽量高效。懂得一些按位计算的技巧,可以很有效的提高程序...

  • 高效代码之按位操作(二)

    首先感谢Nibnat的提醒,昨天最后一个检查2的幂的例子写错了,正确的方法应该是 return ( Number ...

  • 高效代码之按位操作(三)

    作为一个按位操作的业余爱好者,这几天来我总结了一下自己知道的小技巧,希望能和大家分享。由于水平实在有限,这方面的知...

  • 那些高效的时刻

    记的高二有一段时间学习特别高效,当时根本不知道这种状态是一个什么样的存在,用“两耳不闻窗外事,一心只读圣贤书”来形...

  • 位操作

    位操作乘、除、求余,需要乘以或除以2的n次方,都可以用移位的方法代替1、乘a=a*4 <=> a=a<<2 2、...

  • 位操作

    位操作详解 位运算的操作符有:&、|、^、~、>>、<<,六种,分别对应与,或,异或,按位取反,右位移,左位移 1...

  • 位操作

    c++中位操作操作符 这些位操作符只能用于整形的操作,其他会编译报错。位操作符的运算优先级比较低,因为尽量使用括号...

网友评论

      本文标题:位操作不高效的时刻

      本文链接:https://www.haomeiwen.com/subject/stfzlttx.html