有什么相对更好/更正确的方法来确保整数值在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 ”。看起来他们使用此技巧进行了总结。比其他解决方案有效还是更快?
谢谢。
答案 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