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