Tag: 位操作

为什么这个联合的大小是2的位域?

我在Windows上的turbo C上工作,其中char占用一个字节。现在我的问题是下面的联合。 union a { unsigned char c:2; }b; void main() { printf(“%d”,sizeof(b)); \\or even sizeof(union a) } 该程序打印输出为2,其中联合应该只占用1个字节。 为什么会这样? 对于struct,它可以很好地给出1个字节但是这个联合工作不正常。 还有一件事如何访问这些位字段。 scanf(“%d”,&b.c); //even scanf(“%x”,bc); 没有用,因为我们不能有位的地址。所以我们必须使用另一个变量,如下所示 int x; scanf(“%d”,&x); bc=x; 我们不能避免吗? 有没有其他办法???

程序员视角教科书中的无符号/有符号算术问题

int x = random(); int y = random(); unsigned ux = (unsigned) x; unsigned uy = (unsigned) y; 对于以下每个C表达式,您要指出表达式是否总是产生1.如果它总是得到1,则描述基础数学原理。 否则,举一个让它产生0的参数的例子。 A. (x-y) B. ((x+y)<> 2) << 2) <= x 对于这些问题,我认为只有A可以产生0,而其余的总是产生1。 我知道这可能是错的,我不是在寻找直接的答案,但我希望得到一些关于如何处理这些问题的一般知识/建议。 我有一个非常糟糕的教授,我一直在努力寻找在线资源,但我真的不知道从哪里开始或寻找什么。 我知道无符号/二进制补码算术和位移的基础知识,但我不知道如何应用它来查找这些问题的计数器情况。

检查是否未设置位

如果我使用它: if(value & 4)来检查该位是否设置,那么如何检查该位是否未设置? 我尝试使用if(!value & 4)或if(~value & 4)和if(value ^ 4)但它们都不起作用。

在C中翻转双/浮点符号的最快方法

在C中翻转双(或浮点)符号的最快方法是什么? 我想,直接访问符号位将是最快的方法,并找到以下内容: double a = 5.0; *(__int64*)&a |= 0x8000000000000000; // a = -5.0 float b = 3.0; *(int*)&b |= 0x80000000; // b = -3.0 但是,上述内容不适用于负数: double a = -5.0; *(__int64*)&a |= 0x8000000000000000; // a = -5.0

按位移动char的数组

我有一个字符数组,我正试图按位向右移位>> ,然后&与另一个数组。 我想我对如何做到这一点有错误的想法。 我想,即使它是一个字符数组只是说明my_array >>= 1会移动所有内容但我得到一个错误: “error: invalid operands to binary >> (have ‘char[8]’ and ‘int’)” 我试图做的按位比较是使用类似大小的数组启动所有“0”…为此我得到: “error: invalid operands to binary & (have ‘char *’ and ‘char *’)” 在转换和比较之前,我是否需要将这些数组转换为其他数组? 对不起,我不是很清楚…到目前为止所有的好建议,我想我更多地意识到没有超级简单的方法来做到这一点。 更具体地说,我要做的是将WHOLE字符数组的位右移1,将右移的位移回数组的最左侧,与另一个相同大小的数组进行逐位比较。 从技术上讲,比较不必是数组的数组……我只需要比特。 在尝试进行转换/比较之前,将数组转换为其他内容会更容易吗?

为什么在C中右移负数会使最左边的位数为1?

赫伯特·希尔特(Herbert Schildt)的书“C完整参考文献”说:“(在有符号的负整数的情况下,右移将导致1被引入,以便保留符号位。)” 保留标志位有什么意义? 此外,我认为这本书是指使用符号位表示负数而不使用二进制补码的情况 。 但即使在这种情况下,推理似乎也没有任何意义。

有点黑客攻击和模数操作

阅读本文时: http : //graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv 我来到这句话: 最后一步,涉及模数除以2 ^ 10 – 1,具有将64位的每组10位(从位置0-9,10-19,20-29,…)合并在一起的效果值。 (它是关于反转数字中的位)… 所以我做了一些计算: reverted = (input * 0x0202020202ULL & 0x010884422010ULL) % 1023; b = 74 : 01001010 b * 0x0202020202 : 1000000010000000100000001000000010 = 9494949494 :01001010010010100100101001001010010010100 & 10884422010 :10000100010000100010000100010000000010000 = 84000010 : 10000100000000000000000000010000 % 1023 : 1111111111 = 82 : 01010010 现在,唯一有点不清楚的部分是1023(2 ^ 10 – 1)的大数量模块包装并给我反转位的部分……我没有找到关于位操作和位操作之间关系的任何好文档模运算(除了x % […]

在不使用modf()的情况下获取float的小数部分

我正在为没有数学库的平台开发,所以我需要构建自己的工具。 我目前得到分数的方法是将浮点数转换为固定点(乘以(浮点)0xFFFF,转换为int),只得到下部(掩码为0xFFFF)并再次将其转换回浮点数。 然而,不精确是杀了我。 我正在使用我的Frac()和InvFrac()函数来绘制抗锯齿线。 使用modf我得到一个非常流畅的线条。 使用我自己的方法,由于精度损失,像素开始跳跃。 这是我的代码: const float fp_amount = (float)(0xFFFF); const float fp_amount_inv = 1.f / fp_amount; inline float Frac(float a_X) { return ((int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv; } inline float Frac(float a_X) { return (0xFFFF – (int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv; } 提前致谢!

位移,屏蔽还是位域结构?

我刚开始使用钻头。 我正在尝试使用现有的协议,它可以发送三种不同类型的消息。 类型1是16位结构: struct digital { unsigned int type:2; unsigned int highlow:1; unsigned int sig1:5; unsigned int :1; unsigned int sig2:7; }; 前两位(类型,在我上面的结构中)总是1 0。 第三位highlow确定信号是打开还是关闭,sig1 + sig2一起定义信号的12位索引。 该索引在两个字节之间被分割为0,总是在第7位。 类型2是32位结构。 它有一个2位类型,一个10位索引和一个16位值,在位置27,23,15和7处散布着0。一个位字段结构表示forms如下所示: struct analog { unsigned int type:2; unsigned int val1:2; unsigned int :1; unsigned int sig1:3; unsigned int :1; unsigned int sig2:7; unsigned int :1; unsigned […]

使用按位运算符查找是否将每个偶数位设置为0

我有一个32位的int我一次只能访问它8位。 我需要找出每个偶数位是否设置为0,如果为真,则返回0,否则返回1。 到目前为止,我将使用转换为4位,8位变量来拆分我的int。 int a,b,c,d 现在我要不要他们所以现在我将测试该位是否设置为1而不是0.要测试它是否设置为1我将和01010101。 现在我不知道如何判断每个偶数位是否设置为1.我不能使用if / for / while循环或任何条件语句并且需要使用按位运算符。 有任何想法吗????