【问题标题】:circular bit shifting in byte array in javajava中字节数组中的循环位移
【发布时间】:2015-02-04 13:03:19
【问题描述】:

16字节数组如何左移一个字节(8位移位)?

即16字节数组:(0x) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

左移 8 位后:

输出应该是:(0x) 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00

如何在java中做到这一点?

【问题讨论】:

    标签: java bytearray bit-shift


    【解决方案1】:

    这是一种(不是很优雅)的方式:

    byte[] bytes = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc, 0xd, 0xe};
    
    // now shift left
    byte b0 = bytes[0];
    System.arraycopy(bytes, 1, bytes, 0, bytes.length -1);
    bytes[bytes.length - 1] = b0;
    

    【讨论】:

    • @laune - 完成,尽管 OP 确实特别询问了 16 字节数组。
    • 您好,答案非常有用,但是正如您提到的“不是很优雅”的方式,我是否应该接受任何其他更好优化方式的答案或可能性?
    • 这调用了“本机”方法,因此它很可能会使用 s.th。像memmove。也许使用 16+1 显式赋值语句会更快,但我非常怀疑这样做是否值得。
    • @MihirShah - “不是很优雅”的部分是它不是很通用,而不是它的性能可以提高。它只移动一个并且只向左移动。如果我是为自己编写代码,我会很想概括(向左或向右移动;移动超过一个字节)并将其打包到一个方法中——除非这个要求是铁定的保证永远不会改变。 (哈!)正如 laune 指出的那样,循环展开可能是加快此过程的唯一方法,而性能提升可能很小。
    • @Ted Hopp - 非常感谢先生。我正在使用它,因为要求不会改变。
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多