我需要在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值,依此类推.
1). var bitValue = (byteValue & (1 << bitNumber)) != 0;
2).使用System.Collections.BitArray与Get(int index)方法
我正在使用互联网上的补习说进行SCJP考试.
根据我的说明,>>操作员应该是右移,右边是符号位.虽然左移位运算符<<应该保留符号位.
然而,在我周围玩耍时,我可以用<<操作员移动标志(fe Integer.MAX_VALUE << 1评估为-2,而我永远无法用>>操作员移动标志.
我一定是在误解这里的东西,但是什么?
在下面的表达式中,左移操作的结果被赋值给变量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) 在我的编译器上,以下伪代码(用二进制替换的值):
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++编译器的这种行为吗?
我知道,正确移位负签名类型取决于实现,但是如果我执行左移怎么办?例如:
int i = -1;
i << 1;
Run Code Online (Sandbox Code Playgroud)
这个定义明确吗?
我认为该标准没有说明带有签名类型的负值
如果E1具有带符号类型和非负值,并且E1×2 E2在结果类型中可表示,那么这就是结果值; 否则,行为未定义.
它只阐明如果结果在签名类型中无法表示,则行为未定义.
我所拥有的是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) 对于以下程序:
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 >> E2是E1右移位E2位置。如果E1具有无符号类型或E1具有符号类型和非负值,则结果的值是商E1除以数量2的幂的整数部分E2。
此代码的主要目标是带有大多数C90编译器的嵌入式系统。但是,我对编写符合标准的代码感兴趣。我一直在以C99模式在GCC和Clang上进行测试,因此可以restrict正常工作。
我的问题是:
任何人都可以解释为什么以下不编译?
byte b = 255 << 1
Run Code Online (Sandbox Code Playgroud)
错误:
常量值'510'无法转换为'字节'
我期待二进制中的以下内容:
1111 1110
Run Code Online (Sandbox Code Playgroud)
类型转换困扰了我.
这更多的是语言设计而不是编程问题.
以下是JLS 15.19移位运算符的摘录:
如果左手操作数的提升类型是
int,则只使用右手操作数的五个最低位作为移位距离.如果左侧操作数的提升类型是
long,则只使用右侧操作数的六个最低位作为移位距离.
这种行为也在C#中指定,虽然我不确定它是否在Javascript的官方规范中(如果有的话),但至少基于我自己的测试也是如此.
结果是以下情况属实:
(1 << 32) == 1
Run Code Online (Sandbox Code Playgroud)
据我所知,这个规范很可能受到以下事实的启发:当移位32位值(64位为6位)时,底层硬件只占用计数操作数的5位,我可以理解在例如,JVM级别,但为什么高级语言(如C#和Java)会保留这种相当低级别的行为?它们不应该提供超出硬件实现的更抽象的视图,并且行为更直观吗?(如果他们可以采取负数来表示向其他方向转移,那就更好了!)