c++ 按位操作没有任何意义

axzmvihb  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(135)

我目前对按位运算的理解是,它会将一个数字的二进制报复推到特定的次数,或者在过程中删除数字(在>>的情况下)或在数字末尾添加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);
}
c9qzyr3d

c9qzyr3d1#

int32_tsigned,则>>为有符号移位,符号位保持为31。您应该使用uint32_t。对于颜色分量,使用uint8_t也更符合逻辑。

相关问题