C++ 整数换行的正确方法?

C++ 整数换行的正确方法?,c++,operators,bitwise-operators,C++,Operators,Bitwise Operators,有什么相对更好/更正确的方法可以确保整数值在for循环中始终从0到最大8进行环绕?(我使用32次迭代,就像这里的示例一样)我找到了三个选项(A、B和C) 例如: int x = 0; const int max = 8; // EDIT: Always in the power of two. for (int i = 0; i < 32; ++i) { // EDIT: "x++;" usage was incorrect here. x = i; // x = x

有什么相对更好/更正确的方法可以确保整数值在for循环中始终从0到最大8进行环绕?(我使用32次迭代,就像这里的示例一样)我找到了三个选项(A、B和C)

例如:

int x = 0;
const int max = 8; // EDIT: Always in the power of two.

for (int i = 0; i < 32; ++i)
{
    // EDIT: "x++;" usage was incorrect here.
    x = i;

//  x = x % max;  // A
//  x &= max - 1; // B
//  x &= ~max;    // C (EDIT: Incorrect, dont use...)

    std::cout << "x: " << x << std::endl;
}
intx=0;
常量int max=8;//编辑:总是两个人的力量。
对于(int i=0;i<32;++i)
{
//编辑:此处的“x++;”用法不正确。
x=i;
//x=x%max;//A
//x&=max-1;//B
//x&=~max;//C(编辑:不正确,不要使用…)

std::cout在这种特殊情况下,B和C都是有效的,但只有当
max
正好是2的幂时才起作用。如果不是,则
%=
将与其他任何东西一样快。

在这种特殊情况下,B和C都是有效的,但只有当
max
正好是2的幂时才起作用。如果不是,则
%=
将作为fast和其他任何东西一样。

如果[0,8]有效,并且max保证是2的幂,
x&=(max-1)
工作并且比第一个快。不能说C。

如果[0,8)有效,并且max保证是2的幂,
x&=(max-1)
工作起来比第一个快。对于
int
位掩码(
x&=(max-1);
)和模(
x%=max;
)不能说是C.

)解决方案会产生不同的程序集,因为它们会对负值产生不同的结果。虽然模块解决方案可能更易于阅读,但它可能比模块解决方案运行得慢。通常您会使用
x%=max;
,因为这正好表达了您想要做的事情,但如果性能至关重要,则位掩码解决方案是值得的考虑到

请注意,对于
unsigned int
gcc编译这两种解决方案以使用单个
指令


锁紧螺栓:

用于
int
位掩码(
x&=(max-1);
)和模(
x%=max;
)解决方案会产生不同的程序集,因为它们会对负值产生不同的结果。虽然模块解决方案可能更易于阅读,但它可能比模块解决方案运行得慢。通常您会使用
x%=max;
,因为这正好表达了您想要做的事情,但如果性能至关重要,则位掩码解决方案是值得的考虑到

请注意,对于
unsigned int
gcc编译这两种解决方案以使用单个
指令


Godbolt:

x%=max
可能是最容易理解的。你如何知道它的性能关键?你衡量过吗?直觉就像掷硬币一样可靠,可以猜测哪些代码是关键的,哪些代码不是。代码“x&=~max”是在一个生产就绪的实时代码中使用的,所以我假设这是有原因的。
x%=max
可能是最容易理解的。你如何知道它的性能关键?你衡量过它吗?直觉就像掷硬币一样可靠,可以猜出什么代码是关键的,什么代码不是。代码“x&=~max”在一个生产就绪的实时代码中使用,所以我假设这是有原因的。谢谢。我更新了我的问题。你对“x&=~max”有什么想法吗方法?我已经测试过这个方法,它没有问题。我可能需要进一步研究它…@Gediminas如果值永远不会达到16,它就可以工作。它只是确保第4位始终是0。你是对的。我在测试代码中使用了“x++;”,犯了一个错误……这使得我的值从0到7用“~max”环绕,所以我很困惑…谢谢。我已经更新了我的问题。你对“x&=~max”方法有什么想法吗?我已经测试过这个方法,它没有任何问题。我可能需要进一步研究它…@Gediminas如果值从未达到16,它就可以工作。它只是确保第4位始终为0。你是对的。我使用在我的测试代码中,“x++;”使我的值从0到7用“~max”环绕,所以我很困惑。。。