Tag: 位操作

测试按位IPv6网络掩码是否连续的有效方法

我需要在in_addr / in6_addr结构中存储IP地址/网络掩码。 对于IPv4,我使用以下代码来测试网络掩码是否是连续的: ((((~netmask + 1) & (~netmask)) != 0) && (netmask != 0)) 我想知道是否有一种聪明的方法可以为IPv6做同样的事情。

切换MSB的最佳方法是什么?

所以我想切换我的号码中最重要的一点。 这是一个例子: x = 100101 then answer should be 00101 我有一台64位机器因此我不希望答案是100000….100101我想到的一种方法是计算我的数字中的位数然后切换MSB,但不确定关于如何计算。

Bitwise Leftshift(<<)奇怪的行为

gcc bitwise Leftshift( << )奇怪的行为。 这是我的代码: #include #include void foo(int n){ printf(“1<<32:%d\n", 1<<32); printf("1<<(32-n):%d\n", 1<<(32-n)); } int main(){ foo(0); } 如果我将0作为参数传递,结果可能会有所不同。 编译源代码: $gcc main.c -o demo -lm -pthread -lgmp -lreadline 2>&1 main.c: In function ‘foo’: main.c:5:3: warning: left shift count >= width of type [enabled by default] 执行程序: $demo 1<<32:0 1<<(32-n):1 这个结果是我从编译在线网站得到的 如果我将0传递给它,如何使foo函数输出0? (目前输出1代替)

位操作的标准(跨平台)方式

由于是数字的不同二进制表示(例如,采取大/小端),这是跨平台: // NOTE: FIXED-SIZE unsigned integral type some_unsigned_type variable = some_number; // set n-th bit, starting from 1, // right-to-left (least significant-to most significant) variable |= ( 1 << ( n – 1 ) ); // clear the same bit: variable &= ~( 1 << ( n – 1 ) ); 换句话说,编译器是否总是处理固定大小的无符号数的不同二进制表示,或者它是特定于平台的? 如果variable是有符号整数类型(例如, int )并且其值是 […]

将第i位设为零?

无论第i位是什么,我都想将第i位设置为零。 unsigned char pt = 0b01100001; pt[0] = 0; // its not how we do this… 设置为1,我们可以使用掩码pt | (1 << i) pt | (1 << i)但我不知道如何设置0的掩码,如果可能的话。

RGB888转RGB565 /位移

我希望使用位移组合三个字符。 这是为了实现RGB565调色板(红色有5位,绿色有6位,蓝色有5位)。 这是我的示例程序,我只是错过了中间的一步,我认为我需要做一些事情。 #include int main( ){ unsigned char r, g, b; unsigned short rgb; r = 255; // 0xFF 1111 1111 g = 100; // 0x64 0110 0100 b = 50; // 0x32 0011 0010 r = r >> 3; // 0x31 0001 1111 g = g >> 2; // 0x19 0001 1001 b […]

内部计算64位整数中的尾随零位?

这是关于位操作的一些先前问题的后续跟进。 我修改了这个站点的代码来枚举设置了N位的K的字符串(x是设置了K位的当前int64_t ,在这段代码的末尾,它是按字典顺序排列的下一个整数,设置了K位): int64_t b, t, c, m, r,z; b = x & -x; t = x + b; c = x^t; // was m = (c >> 2)/b per link z = __builtin_ctz(x); m = c >> 2+z; x = t|m; 只要最低有效位在x的较低DWORD中,使用__builtin_ctz()的修改就可以正常工作,但如果不是,则完全中断。 这可以通过以下代码看到: for(int i=0; i<64; i++) printf("i=%i, ctz=%i\n", i, __builtin_ctz(1UL << i)); 打印GCC版本4.4.7: […]

C中的“<<”是什么意思?

这是什么意思? #define WS_RECURSIVE (1 << 0) 据我所知,它将定义WS_Recursive (1 << 0)但<<是什么意思? 谢谢!

填写可变数量的

使用未知(在编译时)的数量填充变量的最佳方法是什么? 例如,让我们说: int n = 5; int b = fillwithones(5); 现在b包含11111(二进制)。 我不能只是硬编码int b = 31因为n未提前知道(在我的应用程序中)。 我可以这样做: int b = pow(2, n) – 1 但使用战俘似乎非常浪费。 谢谢!

使用按位移位操作进行符号扩展

在此问答后,我试着检查答案,所以我写道: #include int main () { int t;int i; for (i=120;i> 31; printf (“t = %X , i-128 = %X , ~t & i = %X , ~t = %X \n”, t, i-128 , (~t &i), ~t); } return 0; } 输出是: t = FFFFFFFF , i-128 = FFFFFFF8 , ~t & i = 0 […]