C中十六进制的位移位(旋转)
Bitshift (rotation) with hexadecimal in C
我试图在 C 中循环十六进制数。我遇到的问题是,在每个循环中。数字中出现更多的零。
这是我的代码:
int main (void) {
int hex = 0x1234ABCD;
for(int i=0; i<12;i++,hex <<=4){
printf("0x%04x %d ",hex,hex );
pattern(hex);
}
return 0;
}
我在该网站上看到了一些其他代码,这些代码将 & 0x0F 添加到班次中,但它对我不起作用。
这是我使用编译器的结果
0x1234abcd 305441741 0001 0010 0011 0100 1010 1011 1100 1101
0x234abcd0 592100560 0010 0011 0100 1010 1011 1100 1101 0000
0x34abcd00 883674368 0011 0100 1010 1011 1100 1101 0000 0000
0x4abcd000 1253888000 0100 1010 1011 1100 1101 0000 0000 0000
0xabcd0000 -1412628480 1010 1011 1100 1101 0000 0000 0000 0000
感谢您的帮助。
没有接线员为您轮换。您需要合并 2 个班次操作。此外,在进行移位操作时,您应该使用无符号值。
int main (void) {
unsigned int hex = 0x1234ABCD;
for(int i=0; i<12;i++) {
printf("0x%04x %d ",hex,hex );
pattern(hex);
unsigned int upper = hex >> (sizeof(hex)*CHAR_BIT - 4);
hex <<= 4;
hex |= upper & 0x0F;
}
return 0;
}
当您在数字上使用左移 (<<
) 运算符时,移动 n 位,然后是最重要的 n 该数字的位丢失,最低有效的 n 位用零填充(正如您所注意到的)。
因此,为了执行按位 旋转 ,您需要先 'save' 那些前 4 位,然后将它们放回去(使用 |
运算符将它们向下移动到底部后)。
因此,假设 32 位 int
大小,如下所示:
#include <stdio.h>
int main(void)
{
int hex = 0x1234ABCD;
for (int i = 0; i < 12; i++) {
printf("0x%04x %d ", hex, hex);
pattern(hex);
int save = (hex >> 28) & 0x0F; // Save TOP four bits of "hex" in BOTTOM 4 of "save"
hex <<= 4; // Now shift the bits to the left ...
hex |= save; // ... then put those saved bits in!
}
return 0;
}
注意:我们在移位后用0x0F
屏蔽save
值,以确保所有其他位都是0
;如果我们 不 这样做,那么对于负数,我们可能会得到那些用 1
填充的其他位。
我试图在 C 中循环十六进制数。我遇到的问题是,在每个循环中。数字中出现更多的零。
这是我的代码:
int main (void) {
int hex = 0x1234ABCD;
for(int i=0; i<12;i++,hex <<=4){
printf("0x%04x %d ",hex,hex );
pattern(hex);
}
return 0;
}
我在该网站上看到了一些其他代码,这些代码将 & 0x0F 添加到班次中,但它对我不起作用。
这是我使用编译器的结果
0x1234abcd 305441741 0001 0010 0011 0100 1010 1011 1100 1101
0x234abcd0 592100560 0010 0011 0100 1010 1011 1100 1101 0000
0x34abcd00 883674368 0011 0100 1010 1011 1100 1101 0000 0000
0x4abcd000 1253888000 0100 1010 1011 1100 1101 0000 0000 0000
0xabcd0000 -1412628480 1010 1011 1100 1101 0000 0000 0000 0000
感谢您的帮助。
没有接线员为您轮换。您需要合并 2 个班次操作。此外,在进行移位操作时,您应该使用无符号值。
int main (void) {
unsigned int hex = 0x1234ABCD;
for(int i=0; i<12;i++) {
printf("0x%04x %d ",hex,hex );
pattern(hex);
unsigned int upper = hex >> (sizeof(hex)*CHAR_BIT - 4);
hex <<= 4;
hex |= upper & 0x0F;
}
return 0;
}
当您在数字上使用左移 (<<
) 运算符时,移动 n 位,然后是最重要的 n 该数字的位丢失,最低有效的 n 位用零填充(正如您所注意到的)。
因此,为了执行按位 旋转 ,您需要先 'save' 那些前 4 位,然后将它们放回去(使用 |
运算符将它们向下移动到底部后)。
因此,假设 32 位 int
大小,如下所示:
#include <stdio.h>
int main(void)
{
int hex = 0x1234ABCD;
for (int i = 0; i < 12; i++) {
printf("0x%04x %d ", hex, hex);
pattern(hex);
int save = (hex >> 28) & 0x0F; // Save TOP four bits of "hex" in BOTTOM 4 of "save"
hex <<= 4; // Now shift the bits to the left ...
hex |= save; // ... then put those saved bits in!
}
return 0;
}
注意:我们在移位后用0x0F
屏蔽save
值,以确保所有其他位都是0
;如果我们 不 这样做,那么对于负数,我们可能会得到那些用 1
填充的其他位。