好吧,我会保持这个简单的&简单。
我正在研究Java中的SHA-256的粗暴实现,为了保持类方法有利于应用程序中的其他类,我决定将数据I / O作为32位整数数组(INT)。显然,这些用途在很大程度上依赖于按位运算符的使用,因此我如何实现按一个整数数组进行按位移位:
给定一组数据,假设:
int[16] data;
其中前14个整数的数据用0x0000000填充,用于对话,但最低的两个分别被填充:
data[14] = 0x12345678;
data[15] = 0x01ABCDEF;
如何完成左移,以便左移2,
data[13] = 0x00000012;
data[14] = 0x34567801;
data[15] = 0xABCDEF00;
有人有任何想法吗?
答案 0 :(得分:0)
1)编写帮助方法,将int[16] data
转换为byte[64] bytedata
。
2)使用构造函数BigInteger(byte[] val)
3)使用shiftLeft(int n)
和shiftRight(int n)
4)编写一个帮助方法,将byte[64] bytedata
转换回int[16] data
。见byte array to Int Array here
BigInteger中的其他有用方法包括clearBit(int n)
,setBit(int n)
,flipBit(int n)
和testBit(int n)
答案 1 :(得分:-1)
左移按位:
`x << n` is the same as `x *= 2^n`
要查看溢出位(MSB):
x / (2^32) >= 1
//因为我们使用的是32位int
同样,对于按位右移:
`x >> n` is the same as `x /= 2^n`
要查看溢出位(LSB):
x % 2
通过添加或减去设置值将溢出位附加到相邻的int。你应该像我在评论中提到的那样使用BigInteger,其他任何东西都需要一个实现,你自己读取并附加在数组位置之间移动的位。