Tag: 位操作

C hack用于存储占用1位空间的位?

我在0到67600之间有一长串数字。现在我想使用长度为67600个元素的数组存储它们。 如果数字在集合中,则元素设置为1;如果数字不在集合中,则设置为0。 即。 每次我只需要1位信息来存储一个数字。 C / C ++中是否存在帮助我实现这一目标的黑客攻击?

不使用’ – ‘运算符减去两个数字

我尝试使用以下代码,但我无法理解为什么它给了我错误的答案。 我正在计算2的补码并加上另一个补。 #include int add(int a, int b) { while (a) { a = (a & b) << 1; b = a^b; } return b; } int sub(int a, int b) // add a with b's 2's complement. { return (add(a, add(~b, 1))); } int main() { int a, b, res; a = 3, b […]

优化我! (C,表现) – 跟随苦涩的问题

感谢bit Twiddling的一些非常有用的stackOverflow用户:设置了哪个位? ,我已经构建了我的函数(在问题的最后发布)。 任何建议 – 即使是小建议 – 将不胜感激。 希望它能使我的代码变得更好,但至少它应该教会我一些东西。 🙂 概观 此function将被调用至少10 13次,并且可能经常被调用10 15次 。 也就是说,此代码很可能会运行数月 ,因此任何性能提示都会有所帮助。 此function占计划时间的72-77%,基于分析和不同配置中的大约十二次运行(优化此处不相关的某些参数)。 此function目前平均运行50个时钟。 我不确定这可以改进多少,但我很高兴看到它在30岁时运行。 重点观察 如果在计算的某个时刻你可以告诉你将返回的值很小(准确值可协商 – 比如说,低于一百万) 你可以提前中止 。 我只对大价值感兴趣。 这就是我希望节省大部分时间的方式,而不是通过进一步的微观优化(尽管这些当然也是受欢迎的!)。 绩效信息 smallprimes是一个位数组(64位); 平均大约8位将被设置,但它可以少至0或多达12。 q通常是非零的。 (请注意,如果q和smallprimes为零,则函数会提前退出。) r和s通常为0.如果q为零,r和s也将为0; 如果r为零,则s也是如此。 正如最后的评论所说,nu到底通常是1,所以我有一个有效的特殊情况。 特殊情况下的计算可能会出现溢出风险,但通过适当的建模我已经certificate,对于我的输入,这不会发生 – 所以不要担心这种情况。 此处未定义的function(ugcd,minuu,star等)已经过优化; 无需花很长时间才能运行。 pr是一个小数组(全部在L1中)。 此外,这里调用的所有函数都是纯函数 。 但是如果你真的在乎… ugcd是gcd ,minuu是最小值,vals是尾随二进制0的数量,__ builtin_ffs是最左边的二进制1的位置,star是(n-1)>> vals(n- 1),pr是从2到313的素数数组。 目前正在Phenom II 920 x4上进行计算,尽管对i7或Woodcrest的优化仍然很有意义(如果我在其他节点上获得计算时间)。 我很乐意回答您对该function或其成员的任何问题。 […]

交换C中的数字位

在C访谈中,我被要求将最后4位的数字的前4位交换掉。 (例如,1011 1110应为1110 1011.) 有人有解决方案吗?

查找仅使用按位函数表示2的补码所需的位数

我们可以假设一个int是2位恭维中的32位唯一合法的运算符是:! 〜&^ | + <> 此时我正在使用蛮力 int a=0x01; x=(x+1)>>1; //(have tried with just x instead of x+1 as well) a = a+(!(!x)); …最后2个语句重复32次。 每增加1次,x移位一位,!= 0,全部32位 使用测试编译器,它说我的方法在测试用例0x7FFFFFFF(0后跟31 1)上失败,并说这个数字需要32位来表示。 我不明白为什么这不是31(我的方法计算)谁能解释为什么? 我需要改变什么来解释这个?

如何按位和CFBitVector

我有两个CFMutableBitVector实例,如下所示: CFBitVectorRef ref1, ref2; 我怎样才能对这些家伙进行逐步操作? 就目前而言,我只关心and ,但显然xor , or等等对我们来说很有用。 显然我可以遍历向量中的位,但是当我在位级别工作时,这似乎很愚蠢。 我觉得我只缺少一些Core Foundationfunction,但我找不到它们。 谢谢, 库尔特

使用C中的按位运算符查找x是否大于y

如果x> y,则此函数将返回1,否则返回0。 到目前为止我有 int isitGreater(int x, int y) { return (((y+((~x)+1)) >> 31) & 1); 但它不起作用。 允许的操作:法律操作:! 〜&^ | + <> 我确信我的逻辑是正确的,如果X – Y和我得到一个负数,这意味着y> x,所以第32位是1,所以我把那个位向右移31次然后“和“它与”1“。 编辑:如果x为负,由于溢出,这不起作用。 如何在不使用条件语句的情况下修复此溢出问题?

不正确地更新位字段

我正试图解决一个问题。 它说, 将新变量初始化为值17512807u。 假设我们像往常一样将这些位从0表示为最不重要(在右侧)到31(最重要的,在左侧)。 使用整数值8和位10到14更新位18到21,值为17(十进制)。 将结果值打印为八位hex数字以显示所有数字。 这是我提出的代码: #include int main(){ int value = 17512807u; int L = 21; // starting left position int R = 18; // starting right position int mask = (1 << (L – R + 1) – 1) << R; int newField = (8 << R) & mask; // integer value […]

切换特定位

所以我已经看到了诸如在ith positon稍微切换一下的问题以及如何设置,清除和切换一个位? ,但我想知道是否有一个很好的方法在x86-64汇编中切换第i个位置? 我尝试用C语言编写并查看程序集,并不完全明白为什么有些东西存在。 C: unsigned long toggle(unsigned long num, unsigned long bit) { num ^= 1 << bit; return num; } int main() { printf("%ld\n", toggle(100, 60)); return 0; } 从GDB切换function组件: push rbp mov rbp, rsp mov QWORD PTR [rbp-0x8],rdi mov QWORD PTR [rbp-0x10],rsi mov rax, QWORD PTR [rbp-0x10] mov edx, 0x1 mov ecx, […]

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); […]