如何在按位或?

时间:2016-10-05 19:20:01

标签: c++ g++

早些时候,我问过this question并收到了一个对我提供的示例有效的答案,但似乎没有概括为按位OR。以下是该问题的示例,但添加了按位OR。

#include <stdint.h>

struct MaskAndCount{
    uint64_t occupied : 56;
    uint8_t numOccupied : 8;
};

int main(){
    int count = 7;
    MaskAndCount foo;
    foo.occupied &= ~(1L << count) & 0x00FFFFFFFFFFFFFF;
    foo.occupied |= (1L << count) & 0x00FFFFFFFFFFFFFF;
}

现在,当我们编译时,我们没有收到第一行的警告,但我们确实从第二行收到警告。

g++ -Wconversion Main.cc
Main.cc: In function ‘int main()’:
Main.cc:12:18: warning: conversion to ‘long unsigned int:56’ from ‘long unsigned int’ may alter its value [-Wconversion]
     foo.occupied |= (1L << count) & 0x00FFFFFFFFFFFFFF;

同样,我将提出同样的两个问题。

  1. 写入的转换是否具有截断右侧值的较高位所需的效果?
  2. 是否有办法让本地静音或使用不会触发警告的不同语法表达相同的行为?

0 个答案:

没有答案