void Set(string str)
{
char[] key = String_Unicode(str);
S = new uint[4];
uint temp;
for (j = 0; j < 16; j++)
{
temp = (uint)(key[j])<<(8*(j%4));
S[j / 4] += (uint)temp;
}
}
Nhập vào mảng str 16 kí tự , thông qua hàm String_Unicode() nó sẽ chuyển về mảng char
Chia mảng char làm 4 phần , mỗi phần 32 bit gồm 4 từ , mỗi từ 8 bit. Mỗi phần lưu vào mảng S
en ko hiểu tại sao lại phải dịch đi (8 * ( j%4) ) ở biển temp trước khi cộng dồn vào S[i]
Có phải để đảm bảo đủ 32 bit cho mỗi S[i] ko ạ !

Cho em hỏi luôn là em nhập vào kí tự "o" debug thì key[j] = 111 tương ứng với o trong bảng mã ascii
lúc này j bằng 1 nên 111 dịch 8 bit và được kết quả temp = 28416 , vậy cho em hỏi bit dịch như thế nào để 111 thành 28416 ( em muốn hiểu rõ cách bit dịch chứ ko phải công thức x << i <=> x.2^i )
Biểu diễn nhị phân của 111 là 110 1111 còn của 28416 là gì ạ ???