C 在没有分支的情况下设置或重置给定位

C 在没有分支的情况下设置或重置给定位,c,bit-manipulation,C,Bit Manipulation,在一次采访中,他们问我,如何设置或重置一点?这是一个非常简单的问题,我回答了 在那之后,他们问我,在没有分支的情况下执行。我不知道什么是分支。 我寻找那个,然后来到这里 但仍然没有得到分支和非分支的概念。 请解释分支意味着cpu执行的指令包含条件跳转。非此即彼的选择。这可能意味着一个if、一个for-循环、while-循环、开关、?:或基于布尔值做出决定的东西 人们经常忘记的一类分支也是布尔运算符短路,可能(但不一定在所有CPU上)计算为真值的东西,所以intfoo。。。;福=!傅将是某些CP

在一次采访中,他们问我,如何设置或重置一点?这是一个非常简单的问题,我回答了

在那之后,他们问我,在没有分支的情况下执行
。我不知道什么是分支。
我寻找那个,然后来到这里

但仍然没有得到分支和非分支的概念。
请解释分支意味着cpu执行的指令包含条件跳转。非此即彼的选择。这可能意味着一个
if
、一个
for
-循环、
while
-循环、
开关、
?:
或基于布尔值做出决定的东西

人们经常忘记的一类分支也是布尔运算符短路,可能(但不一定在所有CPU上)计算为真值的东西,所以
intfoo。。。;福=!傅
将是某些CPU上的分支,但不是所有CPU(不是x86上的)

因此,设置一个位:

i |= (1 << bit);
i &= ~(1 << bit);

i |=(1可能是他们想让您演示如何编写没有分支的通用set/reset代码段

这可以通过以下方式实现:

value = (value & ~(1 << bit)) | (bitval << bit);
它实现了几个操作:

  • k1=0
    k2=0
    什么都不做
  • k1=0
    k2=1
    切换位
  • k1=1
    k2=0
    清除位
  • k1=1
    k2=1
    设置位
更普遍地说

value = (value & a) ^ x;
您可以通过以下方式决定同时更改
值的多个位

  • aj=0
    xj=0
    → 将它们设置为0
  • aj=0
    xj=1
    → 将它们设置为1
  • aj=1
    xj=0
    → 让他们保持原样
  • aj=1
    xj=1
    → 翻转它们
根据预先计算的常数
a
x
aj
xj
是常数中第j位的值)

比如说

value = (value & 0x0F) ^ 0x3C;
只需一次手术就可以了

- leave untouched bit 0 and 1
- flip bits 2 and 3
- set to 1 bits 4 and 5
- set to 0 all other bits

我的反问题是:你到底是如何设置或重置分支的?通过“设置或重置”它们的意思是切换吗?你可以用异或来实现这一点。@Art…我对分支一无所知…只是我可以做位操作并设置或重置一点…我想知道什么是分支?+我不知道设置或重置一点与分支有什么关系。我想从这个问题知道这一点。@Matthewmelltt…如果位是
0
,那么让它成为
1
。只需一次。切换:
i^=(1@Art…它与x86编程有关吗?如果我的问题是错误的,很抱歉。不,这是一般编程。全部(除非你去一些真正深奥的东西)CPU有分支指令,分支的概念在所有这些指令中或多或少都是相同的。@Art…谢谢…现在我
将搜索CPU分支指令。它们是什么以及它们如何工作?简而言之,分支指令类似于:如果上一次操作的结果为零/非零/溢出/下溢/比较smaller/比较大/等等(有很多不同的条件可以测试),然后跳转到那边的指令,否则继续在这里执行。
value = (value & 0x0F) ^ 0x3C;
- leave untouched bit 0 and 1
- flip bits 2 and 3
- set to 1 bits 4 and 5
- set to 0 all other bits