Tag: 位操作

C按位否定会产生负输出:

我真的很难翻转C int变量中的位。 我是这样做的: input = 15; input = ~input; printf(“%d”, input); 但它总是显示为-16 。 它应该是0 ! 如果15写为1111 ,为什么它返回10000 ? 这真令人发狂! 有人能帮帮我吗!?

仅使用恒定移位来模拟可变位移?

我试图找到一种方法来执行间接左移/右移操作而不实际使用变量移位操作或任何分支。 我正在研究的特定PowerPC处理器有一个怪癖,即按常数立即移位,就像 int ShiftByConstant( int x ) { return x << 3 ; } 是快速的,单操作的,超标量的,而变量的变换,如 int ShiftByVar( int x, int y ) { return x << y ; } 是一个微编码操作,需要7-11个周期才能执行,而管道的其余部分都停止运行 。 我想做的是找出哪些非微码整数PPC操作sraw解码然后单独发出它们。 这对于sraw本身的延迟没有帮助 – 它将用6替换一个op – 但是在这六个操作之间我可以将一些工作双重调度到其他执行单元并获得净增益。 我似乎无法找到μopssraw解码到的任何地方 – 有没有人知道如何用一系列常量移位和基本整数运算替换变量位移? (for循环或开关或其中带有分支的任何东西都不起作用,因为分支惩罚甚至比微码惩罚更大。) 这不需要在assembly中回答; 我希望学习算法而不是特定的代码,所以用C语言或高级语言甚至伪代码的答案都会非常有用。 编辑:我应该补充一些说明: 我甚至不担心可移植性 PPC具有条件移动,因此我们可以假设存在无分支内部函数 int isel(a,b,c){return a> = 0? b:c; } (如果你写出一个做同样事情的三元组,我会明白你的意思) 整数乘法也是微编码的,甚至比sraw慢。 […]

仅使用按位运算符执行二进制算术运算

可能重复: 如何仅使用位移和加法进行乘法和除法? 我必须编写函数来执行二进制减法,乘法和除法,而不使用除循环控制之外的任何算术运算符。 我之前只用Java编写代码,所以我很难绕过这个问题。 从减法开始,我需要用原型编写一个函数 int bsub(int x, int y) 我知道我需要将y转换为二的补码以使其为负并将其添加到x,但我只知道如何通过使用一个补码运算符并添加1来实现这一点,但我不能使用+运算符。 提供了badd函数,如果我能弄清楚如何制作负数,我将能够在bsub中实现它。 badd的代码如下所示。 提前感谢任何提示。 int badd(int x,int y){ int i; char sum; char car_in=0; char car_out; char a,b; unsigned int mask=0x00000001; int result=0; for(i=0;i<32;i++){ a=(x&mask)!=0; b=(y&mask)!=0; car_out=car_in & (a|b) |a&b; sum=a^b^car_in; if(sum) { result|=mask; } if(i!=31) { car_in=car_out; } else { if(car_in!=car_out) { printf("Overflow occurred\n"); […]

取消设置最右边的设置位

可能重复: 如何在C中设置,清除和切换一个位? 删除最低位 n是正整数。 如何解除最右边的设置位? 假设n = 7 => n = 0111.我想要0110作为输出。 是否有任何简单的按位攻击来实现目标?

整数的位反转,忽略整数大小和字节顺序

给定一个整数typedef: typedef unsigned int TYPE; 要么 typedef unsigned long TYPE; 我有以下代码来反转整数的位: TYPE max_bit= (TYPE)-1; void reverse_int_setup() { TYPE bits= (TYPE)max_bit; while (bits <>= 1, bit_setter<<= 1) if (arg & bit_tester) result|= bit_setter; return result; } 首先需要运行reverse_int_setup(),它存储一个打开最高位的整数,然后对reverse_int( arg )的任何调用返回arg ,其位反转(用作二叉树的一个键,取自一个增加反击,但这或多或少无关紧要)。 在调用reverse_int_setup()之后,是否存在一种与平台无关的方法在编译时为max_int提供正确的值; 否则,是否有一个算法比你对reverse_int() 更好/更精简 ? 谢谢。

在C中实现逻辑右移

我正在使用仅按位运算符在C中创建逻辑右移位function。 这就是我所拥有的: int logical_right_shift(int x, int n) { int size = sizeof(int); // size of int // arithmetic shifts to create logical shift, return 1 for true return (x >> n) & ~(((x >> (size << 3) – 1) << (size <> (n-1); } 这实际上适用于所有情况,除非n = 0.我一直试图找到一种方法来解决它,所以它也适用于n = 0,但我卡住了。

C问题:无符号整数和按位运算中的填充位(C89)

我有很多代码对无符号整数执行按位运算。 我编写了我的代码,假设这些操作是在固定宽度的整数上,没有任何填充位。 例如,32位无符号整数的数组,其中所有32位可用于每个整数。 我希望使我的代码更具可移植性,并且我专注于确保我符合C89 (在这种情况下)。 我遇到的一个问题是填充整数。 拿这个极端的例子,取自GMP手册 : 然而,在Cray矢量系统上,可以注意到short和int总是以8个字节存储(并且sizeof指示),但仅使用32或46位。 指甲function可以通过传递例如8 * sizeof(int)-INT_BIT来解决这个问题。 我也在其他地方读过这种类型的填充物。 我昨晚真的在SO上看了一篇post(请原谅我,我没有链接,我要引用类似记忆的东西),如果你有一个带有60个可用位的双,另外4个可以用于填充和那些填充位可以用于某些内部目的,因此它们不能被修改。 例如,假设我的代码是在一个平台上编译的,其中unsigned int类型的大小为4个字节,每个字节为8位,但最重要的2位是填充位。 在这种情况下,UINT_MAX会是0x3FFFFFFF(1073741823)吗? #include #include /* padding bits represented by underscores */ int main( int argc, char **argv ) { unsigned int a = 0x2AAAAAAA; /* __101010101010101010101010101010 */ unsigned int b = 0x15555555; /* __010101010101010101010101010101 */ unsigned int c = a […]

if-statement和bitwise操作在这个例子中是如何相同的?

我正在阅读这个答案 ,并提到这个代码; if (data[c] >= 128) sum += data[c]; 可以用这个替换; int t = (data[c] – 128) >> 31; sum += ~t & data[c]; 我很难理解这一点。 有人可以解释按位运算符如何实现if语句的作用吗?

C&PHP:使用按位运算符将整数设置存储?

我不熟悉按位运算符,但我似乎以前用它们来存储简单的设置。 我需要将几个开/关选项传递给一个函数,我想为此使用一个整数。 我该如何设置和阅读这些选项?

按位运算和转换

我很难理解这段代码的工作方式和原因。 我在这个任务中的合作伙伴完成了这一部分,我无法得到他,以了解它的工作原理和原因。 我已经尝试了一些不同的东西来理解它,但任何帮助将非常感激。 此代码使用2的补码和32位表示。 /* * fitsBits – return 1 if x can be represented as an * n-bit, two’s complement integer. * 1 <= n <= 32 * Examples: fitsBits(5,3) = 0, fitsBits(-4,3) = 1 * Legal ops: ! ~ & ^ | + <> * Max ops: 15 * Rating: 2 */ int […]