整数回绕的正确方法是?

时间:2018-11-13 19:22:52

标签: 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 % max;  // A
//  x &= max - 1; // B
//  x &= ~max;    // C (EDIT: Incorrect, dont use...)

    std::cout << "x: " << x << std::endl;
}

还有其他建议吗?

编辑:性能至关重要,需要最快的解决方案。 我看到某些第三方性能关键代码中使用了“ x&=〜max ”。看起来他们使用此技巧进行了总结。比其他解决方案有效还是更快?

谢谢。

3 个答案:

答案 0 :(得分:2)

B和C在此特定情况下均有效,但仅在import { Component, OnInit, Input } from '@angular/core'; import { LoadingService } from '../loading.service'; import { FinaeoApiService } from '../finaeo-api.service'; import { ActivatedRoute } from '@angular/router'; import * as _ from 'lodash'; import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; @Component({ selector: 'app-contact-individual', templateUrl: './contact-individual.page.html', styleUrls: ['./contact-individual.page.scss'], }) export class ContactIndividualPage implements OnInit { contact: any; initials: string = ''; safeHTML: SafeResourceUrl; private htmlValue: string; constructor( private loadingService: LoadingService, private api: FinaeoApiService, private route: ActivatedRoute, private sanitizer: DomSanitizer ) { } urlSan(value: string) { this.htmlValue = value; this.safeHTML = this.sanitizer.bypassSecurityTrustResourceUrl(value); }; async ngOnInit() { await this.loadingService.load(async () => { const routeParams = <any> this.route.params; this.contact = await this.api.getModel('Contact', routeParams._value.id); _.forEach(this.contact.notes, function(html) { urlSan(html.note) }) this.initials = this.contact.firstName != null ? this.contact.firstName.charAt(0) + this.contact.lastName.charAt(0) : ''; }); } } 正好为2的幂时才有效。如果不是这样,max将和其他任何东西一样快。

答案 1 :(得分:1)

如果[0,8)有效,并且max保证为2的幂,则%=起作用并且比第一个更快。不能说C。

答案 2 :(得分:1)

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

请注意,对于unsigned int,gcc将两个解决方案都编译为使用一条and指令。

Godbolt:https://godbolt.org/z/WAckr7