我目前对按位运算的理解是,它会将一个数字的二进制报复推到特定的次数,或者在过程中删除数字(在>>
的情况下)或在数字末尾添加0(在<<
的情况下)。那么为什么当我有一个存储int32_t color = 0xFFFF99FF; (= 1111 1111 1111 1111 1001 1001 1111 1111)
的十六进制值的int 32时会这样呢将该int右移24位应该给予值FF,因为我们将前两个字节移动了剩余的字节数(32 - 8 = 24),但实际发生的是,当我执行代码时,我以值-1结束,而在calculator中为0**注意:**向右移位18位产生了我想要的结果。
我正在使用SDL 2库和C++
我试图存储颜色作为他们的十六进制值,然后提取红色,绿色和蓝色通道忽略阿尔法之一。这里的代码是最小化没有任何不必要的细节。
int32_t color; //hex value of the color yellow
//taking input and changing the value of color based on it
if (event->type == SDL_KEYDOWN) {
switch (event->key.keysym.sym)
{
case SDLK_a:
//SDL_SetRenderDrawColor(renderer, 255, 255, 153, 255); // sand
color = 0xFFFF99FF; //hex code for sand color
break;
case SDLK_z:
//SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255); // water
color = 0x0000FFFF; //hex code for blue color ...
break;
case SDLK_e:
//SDL_SetRenderDrawColor(renderer, 139, 69, 19, 255); // dirt
color = 0x8B4513FF;
break;
case SDLK_d:
//SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // delete button || air
color = 0x000000FF;
break;
default:
OutputDebugString("unhandled input.\n");
break;
}
}
//checking for mouse input and drawing a pixel with a specific color based on it
if (event-\>button.button == SDL_BUTTON_LEFT)
{
SDL_SetRenderDrawColor(renderer, color \>\> 24, (color \>\> 16) - (color \>\> 24), (color \>\> 8) - ((color \>\> 16) - (color \>\> 24) + color \>\> 24));
OutputDebugString(std::to_string(color \>\> 24).c_str());
SDL_RenderDrawPoint(renderer, mouseX / 4, mouseY / 4);
SDL_RenderPresent(renderer);
}
1条答案
按热度按时间c9qzyr3d1#
int32_t
为 signed,则>>
为有符号移位,符号位保持为31。您应该使用uint32_t
。对于颜色分量,使用uint8_t
也更符合逻辑。