Tag: 位运算符

逻辑运算符与按位运算符的关键点是什么?

鉴于此声明是一个逻辑操作 ((a > 5) && (b > 4)) 这句话是按位操作的 ((a > 5) & (b > 4)) 以上两个陈述并不等同。 因为(a > 5)是{0,1}的元素 那么,为什么我们需要logical operators & bitwise-operation ? 编辑 :感谢所有的反馈。 关于逻辑运算符的短路行为,我实际上不希望这种行为 – 我正在为GPU编写代码,其中分支会降低性能:短路导致两个分支而不是代码中的一个分支。 对于C中的数值比较,在不需要短路的情况下,似乎逻辑和按位具有相同的行为。 在我的例子中,按位运算比逻辑快。 我为没有将这些细节放在原始post中而道歉。

是否可以对char数组进行位掩码

假设我有以下char数组 char array[32]; 我想只使用此数组的10个最高有效位作为哈希值。 是否可以对此char数组使用按位运算? 如果是这样,我该怎么办?

位移x *一个数字

你如何从这些位移实践问题中获得-10数字? 根据我的理解, X*32可以写成x<<5 。 但你怎么得到像x*66或X*(-10) ?

c中的位移乘法不使用2的幂

如何使用位移执行乘法36? 是不是只能乘以2的幂? 例如: unsigned x = 4; // binary 00000000 00000000 00000000 00001000 unsigned y = x << 3; // multiply by 8, resulting in binary 00000000 … 00100000 谢谢!

大于C的function

我知道这是一个古老的问题,你可能也遇到过这个问题,但我的解决方案中有一个错误,我不知道如何解决它。 我需要编写一个比较两个整数的函数。 我只允许使用操作(!,〜,&,^,|,+,>>,<<),也没有控制结构(if,else循环等)。 isGreater(int x, int y) { //returns 1 if x > y. return ((y+(~x+1))>>31)&1; } 我的想法很简单,我们计算yx,我们移动31得到符号位,如果它是负数,那么我们返回零,否则我们返回1.当x为负时,失败并且当falsly返回1时失败,尽管它应返回零。 我被困在这里,不知道如何继续。 我们假设整数是32位并使用二进制补码表示。 这个问题与可移植性无关。 一些帮助将非常感激。 提前致谢

仅使用“〜&^ |实现逻辑右移 + <> =“运营商和20个运营

所以我有一个赋值,我必须在c中编写一个只使用〜,&,^,|的按位运算的函数 ,+,<>和=。 我只需要使用20次操作。 并且我不允许使用控制结构,例如,if-else,for,while,switch,或其他任何可以在条件块中使用代码的东西。 同样类型转换也是out ,并且未在函数头中声明的字节(给我),限制为1个字节或8位值; 所以我有hex到FF。 我必须编写的函数是逻辑右移。 因此,不是填充符号位的位,而是填充0 这就是我所做的: int logicalShift(int x, int n) { int op=0xFFFFFFFF; int tcn=(~n+1); int sizeshift=0x20 & tcn; op=(op<>n) + (op)); } 这是我期望获得的(对于x = 0x80000000,并且n = 0x01)我期望得到0x40000000,其为十进制的1073741824。 这就是我得到的。 然而(对于x = 0x80000000,n = 0x0我期望得到0x80000000,但是我得到0x7fffffff这是我的答案减去一点。我可以添加一点,但它弄乱了第一个答案。所以我做错了什么我有一个案子而不是另一个案件。我也试过了。 int logicalShift(int x, int n) { int op=0xFFFFFFFF; int tcn=(~n+1); int sizeshift=0x20 & tcn; op=(op<>n) + […]

构造一个逻辑表达式,它将计算一个字节中的位

在采访新的候选者时,我们通常要求他们写一段C代码来计算给定字节变量中值为1的位数(例如,字节3有两个1位)。 我知道所有常见的答案,例如右移八次,或索引256个预先计算结果的常数表。 但是,如果不使用预先计算的表,是否有更聪明的方法? 什么是字节操作(AND,OR,XOR,+, – ,二进制否定,左移和右移)的最短组合,它计算1位的数量?

C – 在两个数字之间切换一下

我刚试过这段代码: void swapBit(unsigned char* numbA, unsigned char* numbB, short bitPosition)//bitPosition 0-x { unsigned char oneShift = 1 << bitPosition; unsigned char bitA = *numbA & oneShift; unsigned char bitB = *numbB & oneShift; if (bitA) *numbB |= bitA; else *numbB &= (~bitA ^ oneShift); if (bitB) *numbA |= bitB; else *numbA &= (~bitB ^ oneShift); […]

为什么C不能旋转左/右操作符?

我想,这是一个哲学问题。 C语言具有标准的逐位操作集,包括OR , AND , XOR , SHIFT LEFT/RIGHT和NOT 。 为什么不旋转左/右旋转操作符或语言中包含的函数? 这些运算符与其他逐位运算符具有相同的复杂性,并且通常需要单个汇编指令,就像其他运算符一样。 此外,我可以想到旋转运算符的很多用途,可能不比xor运算符少 – 所以对我来说听起来有些奇怪,它们不包含在C中。 如果您确实需要使用C或C ++进行旋转, 那么有关于它的最佳实践的单独的常见问题解答 。 对此问题的讨论是偏离主题的。

在GNU C中获取/设置整数最高位的最便携方法是什么

在GNU C中获取/设置整数最高位的最便携方法是什么? 这是彭博采访问题。 那个时候我没有给出最好的答案。 有人可以回答吗? 谢谢