标签: bit-shift

如何从C中的数字中提取特定位?

我需要在C中提取short数据类型的特定部分(没有位).

例如,我的二进制52504为11001101000 11000,我想要前6(FROM LSB - > MSB即011000十进制24)位和其余10位(11001101000十进制820).

类似地,我希望这个函数过于通用,不能提取给定"start"和"end"的特定位数(即位块等效于一些十进制值).

我检查了其他帖子,但那些没有帮助,因为给定的功能没有太多的概括.

我需要一些可以用于shortC数据类型的东西.

编辑

我有2048字节的短数组.每个像素为10位.所以我的16位组成每个字节占用一些时间2像素数据,有时3像素数据.

喜欢

(PIXEL:0,1)10 BITS + 6 BITS

然后(PIXEL:1,2,3)4 BITS(剩余第1个像素位)+ 10个BITS + 2个BITS.

等等..这个模式继续......所以,我想要提取每个像素并制作一个整个数组,让每个像素被占用在整个字节(16位)上,如... 1字节应该包含1 DATA PIXEL,另一个BYTE应该包含整个16位的其他PIXEL值,依此类推.

c bit-manipulation bit-shift bit

19
推荐指数
3
解决办法
7万
查看次数

获得比特值的BitArray比使用按位移位的简单结合更快吗?

1). var bitValue = (byteValue & (1 << bitNumber)) != 0;

2).使用System.Collections.BitArrayGet(int index)方法

  • 什么更快?
  • 在.NET项目的什么情况下,BitArray比按位移的简单连接更有用?

c# performance bit-shift bitarray logical-operators

19
推荐指数
2
解决办法
2万
查看次数

按位移位运算符.签名和未签名

我正在使用互联网上的补习说进行SCJP考试.

根据我的说明,>>操作员应该是右移,右边是符号位.虽然左移位运算符<<应该保留符号位.

然而,在我周围玩耍时,我可以用<<操作员移动标志(fe Integer.MAX_VALUE << 1评估为-2,而我永远无法用>>操作员移动标志.

我一定是在误解这里的东西,但是什么?

java scjp bit-shift

18
推荐指数
1
解决办法
2万
查看次数

直接将左移操作的结果分配给变量和C中的左移分配操作有什么区别?

在下面的表达式中,左移操作的结果被赋值给变量i.

int i;
i = 7 << 32;
printf("i = %d\n",i);
Run Code Online (Sandbox Code Playgroud)

在下面的表达式中,执行左移位分配操作.

int x = 7;
x <<= 32;
printf("x = %d\n",x);
Run Code Online (Sandbox Code Playgroud)

上述两种表达都给出了不同的结果.但是以下两个表达式并不相同.两者都给出了相同的结果.那么上述表达式返回不同值的原因是什么呢?

int a;
a = 1 + 1;
printf("a = %d\n",a);

int b = 1;
b += 1;
printf("b = %d\n",b);
Run Code Online (Sandbox Code Playgroud)

c bit-shift relational-operators

18
推荐指数
2
解决办法
1592
查看次数

右移和有符号整数

在我的编译器上,以下伪代码(用二进制替换的值):

sint32 word = (10000000 00000000 00000000 00000000);
word >>= 16;
Run Code Online (Sandbox Code Playgroud)

生成一个如下所示word的位域:

(11111111 11111111 10000000 00000000)
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以依赖所有平台和C++编译器的这种行为吗?

c++ bit-shift platform-specific

17
推荐指数
4
解决办法
2万
查看次数

左右移位负整数是否定义了行为?

我知道,正确移位负签名类型取决于实现,但是如果我执行左移怎么办?例如:

int i = -1;
i << 1;
Run Code Online (Sandbox Code Playgroud)

这个定义明确吗?

我认为该标准没有说明带有签名类型的负值

如果E1具有带符号类型和非负值,并且E1×2 E2在结果类型中可表示,那么这就是结果值; 否则,行为未定义.

它只阐明如果结果在签名类型中无法表示,则行为未定义.

c++ bit-shift undefined-behavior

17
推荐指数
2
解决办法
1万
查看次数

从RGB整数转换为十六进制

我所拥有的是R:255 G:181 B:178,我在C#工作(对于WP8,更具体)

我想将其转换为十六进制数字以用作颜色(设置WriteableBitmap的像素颜色).我正在做的是以下内容:

int hex = (255 << 24) | ((byte)R << 16) | ((byte)G << 8) | ((Byte)B<<0);
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我才会变蓝.

我有什么想法我做错了吗?

另外,要撤消此操作,要检查RGB值,我将:

int r = ((byte)(hex >> 16)); // = 0
int g = ((byte)(hex >> 8)); // = 0
int b = ((byte)(hex >> 0)); // = 255
Run Code Online (Sandbox Code Playgroud)

c# bitmap bit-shift

17
推荐指数
3
解决办法
3万
查看次数

C移位表达式是否具有无符号类型?为什么夹板会警告右移?

对于以下程序:

int main(void)
{
    int value = 2;
    int result = value >> 1U;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

... Splint 3.1.2给出警告:

splint_test.c: (in function main)
splint_test.c:4:18: Variable result initialized to type unsigned int, expects
                       int: value >> 1U
  To ignore signs in type comparisons use +ignoresigns
Run Code Online (Sandbox Code Playgroud)

Splint似乎声称有符号整数右移的表达式具有无符号整数的类型。但是,我可以在ANSI C90标准中找到的全部是:

结果E1 >> E2E1右移位E2位置。如果E1具有无符号类型或E1具有符号类型和非负值,则结果的值是商E1除以数量2的幂的整数部分E2

此代码的主要目标是带有大多数C90编译器的嵌入式系统。但是,我对编写符合标准的代码感兴趣。我一直在以C99模式在GCC和Clang上进行测试,因此可以restrict正常工作。

我的问题是:

  1. C标准是否对移位结果的类型提出任何要求?
  2. 做编译器吗?
  3. 如果不是,为什么夹板会发出此警告?

c code-analysis splint bit-shift language-lawyer

17
推荐指数
2
解决办法
731
查看次数

左位移255(作为一个字节)

任何人都可以解释为什么以下不编译?

byte b = 255 << 1
Run Code Online (Sandbox Code Playgroud)

错误:

常量值'510'无法转换为'字节'

我期待二进制中的以下内容:

1111 1110
Run Code Online (Sandbox Code Playgroud)

类型转换困扰了我.

c# bit-manipulation bit-shift

16
推荐指数
4
解决办法
3万
查看次数

C#/ Java等高级语言掩盖位移计数操作数的原因是什么?

这更多的是语言设计而不是编程问题.

以下是JLS 15.19移位运算符的摘录:

如果左手操作数的提升类型是int,则只使用右手操作数的五个最低位作为移位距离.

如果左侧操作数的提升类型是long,则只使用右侧操作数的六个最低位作为移位距离.

这种行为也在C#中指定,虽然我不确定它是否在Javascript的官方规范中(如果有的话),但至少基于我自己的测试也是如此.

结果是以下情况属实:

(1 << 32) == 1
Run Code Online (Sandbox Code Playgroud)

据我所知,这个规范很可能受到以下事实的启发:当移位32位值(64位为6位)时,底层硬件只占用计数操作数的5位,我可以理解在例如,JVM级别,但为什么高级语言(如C#和Java)会保留这种相当低级别的行为?它们不应该提供超出硬件实现的更抽象的视图,并且行为更直观吗?(如果他们可以采取负数来表示向其他方向转移,那就更好了!)

c# java bit-manipulation language-design bit-shift

16
推荐指数
3
解决办法
1733
查看次数