C++ 如何对u16*'进行位移位;谁的数据?

C++ 如何对u16*'进行位移位;谁的数据?,c++,opengl,bit-manipulation,C++,Opengl,Bit Manipulation,对不起,如果这没有任何意义,但我正在尽我最大的努力去理解它 所以我在openGL中基本上有一个指向纹理数据的指针,它是16 bpp(pcx.image.data16),我需要为每个像素打开alpha位。所以我想到了这个,但你可以看出这真的很糟糕 for(int i = 0; i < (TEXTURE_SIZE_128 * TEXTURE_SIZE_128); i++){ pcx.image.data16 |= 1 << ((16 * i) + 15);

对不起,如果这没有任何意义,但我正在尽我最大的努力去理解它

所以我在openGL中基本上有一个指向纹理数据的指针,它是16 bpp(pcx.image.data16),我需要为每个像素打开alpha位。所以我想到了这个,但你可以看出这真的很糟糕

for(int i = 0; i < (TEXTURE_SIZE_128 * TEXTURE_SIZE_128); i++){
        pcx.image.data16 |=  1 << ((16 * i) + 15);
    }
如何修复这些错误,以及我是否正确地更改了每像素的alpha位?

尝试以下方法:

for(unsigned i = 0; i < (TEXTURE_SIZE_128 * TEXTURE_SIZE_128); i++)
    {
        constexpr u16 ALPHA_BIT = 1 << 15;
        pcx.image.data16[i] |= ALPHA_BIT;
    }
for(无符号i=0;i<(纹理大小128*纹理大小128);i++)
{
constexpr u16 ALPHA_BIT=1尝试以下方法:

for(unsigned i = 0; i < (TEXTURE_SIZE_128 * TEXTURE_SIZE_128); i++)
    {
        constexpr u16 ALPHA_BIT = 1 << 15;
        pcx.image.data16[i] |= ALPHA_BIT;
    }
for(无符号i=0;i<(纹理大小128*纹理大小128);i++)
{

constexpr u16 ALPHA_BIT=1您已经得到了如何修复它的答案,但没有解释代码错误的原因。让我们看看这段代码:

pcx.image.data16 |=  1 << ((16 * i) + 15);
强制,即它丢弃位,不适合L值

最后但并非最不重要的一点:表达式
pcx.image.data16
是一个指针。此指针指向数据数组的第一个元素。分配给此指针只会更改此指针,而不是它指向的数据。因此,您必须取消对指针的引用。您可以通过在指针前面加上
*
o来取消对指针的引用r通过附加索引运算符
[…]
。请注意
*
[0]
是相同的!因此如果

 *pcx.image.data16;
这只会取消对第一个数组元素的引用(可能有16位,但可能更多)。无论如何,您不能为它分配更大的位向量,它会“包装”到下一个元素中(这是一件好事!)

因此,解决方案是,迭代数组的所有元素,并为每个元素集添加额外的位:

for(int i = 0; i < (TEXTURE_SIZE_128 * TEXTURE_SIZE_128); i++){
    pcx.image.data16[i] |=  1 << 15;
}
for(int i=0;i<(纹理大小128*纹理大小128);i++){

pcx.image.data16[i]|=1您已经得到了如何修复它的答案,但没有解释代码错误的原因。让我们看看这段代码:

pcx.image.data16 |=  1 << ((16 * i) + 15);
强制,即它丢弃位,不适合L值

最后但并非最不重要的一点:表达式
pcx.image.data16
是一个指针。此指针指向数据数组的第一个元素。分配给此指针只会更改此指针,而不是它指向的数据。因此,您必须取消对指针的引用。您可以通过在指针前面加上
*
o来取消对指针的引用r通过附加索引运算符
[…]
。请注意
*
[0]
是相同的!因此如果

 *pcx.image.data16;
这只会取消对第一个数组元素的引用(可能有16位,但可能更多)。无论如何,您不能为它分配更大的位向量,它会“包装”到下一个元素中(这是一件好事!)

因此,解决方案是,迭代数组的所有元素,并为每个元素集添加额外的位:

for(int i = 0; i < (TEXTURE_SIZE_128 * TEXTURE_SIZE_128); i++){
    pcx.image.data16[i] |=  1 << 15;
}
for(int i=0;i<(纹理大小128*纹理大小128);i++){

pcx.image.data16[i]|=1它在正确的轨道上,这是您遇到的编译器错误吗?尝试环绕1它在正确的轨道上,这是您遇到的编译器错误吗?尝试环绕1+1似乎很好。
constepr
不需要,但因为编译器足够聪明,可以注意到它是常量。+1似乎很好。
constepr
不需要因为编译器足够聪明,可以注意到它是常量。