这个按位“|”的结果是什么?运算符: ok|=(s[i]=='0' && s[i+1]=='1')

问题描述 投票:0回答:1

我不明白这个带有按位

|
运算符的代码行。

ok|=(s[i]=='0' && s[i+1]=='1');

结果如何?

#include<iostream>
using namespace std;

void solve(){
    string s; //`string`
    cin>>s //`string input`
    int res=1;
    bool ok=false;

    for(int i=0;i+1<(int) (s.size());i++){
        res+=(s[i]!=s[i+1]);
        ok|=(s[i]=='0' && s[i+1]=='1');//`this line i dont understand`
    }
    cout<<res<<'\n';
}

切割二元运算。

c++ bit-manipulation
1个回答
0
投票

(s[i]=='0' && s[i+1]=='1')
是一个布尔表达式,如果
true
s[i]
并且
'0'
s[i+1]
,结果将是
'1'
,否则结果将是
false
。因此,
ok
将在每次循环迭代时使用
ok|=true
ok|=false
进行更新。

但是,

|=
没有定义
bool
运算符,因此编译器会将
ok
true
|
false
结果先转换为
int
,然后使用
int
执行按位运算s,然后将结果赋回给
ok

实际上,该声明:

ok|=(s[i]=='0' && s[i+1]=='1');

相当于这个:

ok = bool(int(ok) | int(s[i]=='0' && s[i+1]=='1'));

ok
被初始化为
false
(0),然后如果
true
在任何地方包含子串
s
,则其低位切换为1(
"01"
),否则
ok
将保留为
false

© www.soinside.com 2019 - 2024. All rights reserved.