有没有人能帮我解决下面的问题?假设我有二进制值int colour,它是255或即
00000000 00000000 000000000 11111111以二进制表示。如何执行移位操作才能获得
11111111 11111111 11111111 00000000我尝试对0xff,0xff00,0xff0000,0xff000000做4个值,并准备对它们进行OR运算,但是当我打印出这些值时,我得到了以下错误:
converter.c:66:23: runtime error: left shift of 255 by 24 places cannot be represented in type 'int'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior converter.c:66:23
in
VALS ARE ff, ff00, ff0000, ff000000下面是我的代码,如果有任何帮助,我们将不胜感激
int val1 = colour;
int val2 = (colour << 8);
int val3 = (colour << 16);
int val4 = (colour << 24);
//unsigned int val5 = 0;
printf("VALS ARE %x, %x, %x, %x\n" , val1, val2, val3, val4);
//rowElement(colour, sketch);发布于 2021-12-03 20:59:12
写一篇就足够了
int x = 255;
x ~= x;或者,最好将变量x声明为unsigned int类型。
unsigned int x = 255;
x ~= x;至于移位运算符,则根据C标准(6.5.7按位移位运算符)
4 E1 << E2的结果是E1左移位E2位位置;空出的位用零填充。如果E1有一个无符号类型,则结果的值是E1×2E2,比结果类型中可以表示的最大值多减一个模。如果E1具有带符号的类型和非负值,并且E1×2E2在结果类型中可表示,则这是结果值;否则,行为未定义。
发布于 2021-12-04 01:24:00
要反转ARGB颜色或任何32位无符号整数中的字节,请向右移位,然后使用0xff,例如,要从0x11223344获取44,我们只需使用0x11223344 & 0xff来获取33,向右移位8位-> 0x00112233,然后再次使用0xff。
需要左移才能再次构建32位整数。
int main(void)
{
unsigned int colour = 0x11223344;
unsigned char byte0, byte1, byte2, byte3;
byte0 = (colour ) & 0xff;
byte1 = (colour >> 8 ) & 0xff;
byte2 = (colour >> 16) & 0xff;
byte3 = (colour >> 24) & 0xff;
unsigned int reversed = byte0 << 24 | byte1 << 16 | byte2 << 8 | byte3;
printf("%08X\n", colour);
printf("%08X\n", reversed);
return 0;
}输出
11223344
44332211https://stackoverflow.com/questions/70220553
复制相似问题