标签: bit-shift

按位运算符和"字节序"

字节操作,字节顺序是否重要?任一逻辑或移位?

我正在做作业关于位运算符,我不能做出正面或反面就可以了,我想我已经相当挂了字节序.也就是说,我正在使用一个小端机器(像大多数人一样),但是这需要考虑还是浪费的事实?

如果重要,我正在使用C.

c bit-manipulation bit-shift endianness

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

按位移位(左或右)做什么以及它用于什么?

我已经看过运算符>>和我看过的<<各种代码(我实际上并没有理解),但我只是想知道它们实际上做了什么以及它们的实际用途是什么.

编辑

如果移位是喜欢x * 2x / 2,就是从实际使用的真正的区别*/运营商?有性能差异吗?

bit-manipulation bit-shift bitwise-operators

63
推荐指数
5
解决办法
11万
查看次数

当使用超过32次时,32位整数为什么不按预期工作,为什么不移位"<<"?

当我编写以下程序并使用GNU C++编译器时,1我认为输出是由编译器执行的旋转操作引起的.

#include <iostream>

int main()
{
    int a = 1;
    std::cout << (a << 32) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但从逻辑上讲,正如所说的那样,如果位溢出位宽就会丢失,输出应为0.发生了什么?

代码在ideone上,http: //ideone.com/VPTwj .

c++ bit-shift

59
推荐指数
7
解决办法
5万
查看次数

警告:左移计数> =类型的宽度

我很擅长处理比特,并且在编译时遇到以下警告:

 7: warning: left shift count >= width of type
Run Code Online (Sandbox Code Playgroud)

我的第7行看起来像这样

unsigned long int x = 1 << 32;
Run Code Online (Sandbox Code Playgroud)

如果long我的系统的大小是32位,这将是有意义的.但是,sizeof(long)返回8CHAR_BIT定义为8建议long应为8x8 = 64位长.

我在这里错过了什么?是sizeofCHAR_BIT不准确还是我误解了一些基本的东西?

c bit-manipulation bit-shift long-integer

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

Java"Bit Shifting"教程?

我会感谢一个很好的教程,为Java新手解释如何在java中所有的"位移"工作.

我总是偶然发现它,但从未理解它是如何工作的.它应该解释java中使用byteshifting/bitmanipulation可能实现的所有操作和概念.

这只是我的意思的一个例子,(但我正在寻找一个解释每个可能的操作的教程):

byte b = (byte)(l >> (8 - i << 3));
Run Code Online (Sandbox Code Playgroud)

java bit-manipulation bit-shift

46
推荐指数
6
解决办法
9万
查看次数

在C#中,两个左尖括号"<<"是什么意思?

基本上是标题中的问题.我正在看MVC 2源代码:

[Flags]
public enum HttpVerbs {
    Get = 1 << 0,
    Post = 1 << 1,
    Put = 1 << 2,
    Delete = 1 << 3,
    Head = 1 << 4
}
Run Code Online (Sandbox Code Playgroud)

而我只是好奇双左眼角饼干的<<作用.

.net c# operators bit-shift bitwise-operators

43
推荐指数
14
解决办法
4709
查看次数

当左侧操作数具有负值时,为什么左移操作会调用未定义的行为?

在C中,当左侧操作数具有负值时,左移位操作会调用未定义的行为.

ISO C99相关引用(6.5.7/4)

E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1×2 E2,比结果类型中可表示的最大值减少一个模数.如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为未定.

但在C++中,行为定义明确.

ISO C++ - 03(5.8/2)

E1 << E2的值是E1(解释为位模式)左移E2位位置; 空位是零填充的.如果E1具有无符号类型,则结果的值为E1乘以上升到功率E2的数量2,如果E1的类型为无符号长,则减少模ULONG_MAX + 1,否则为UINT_MAX + 1.[注意:标题中定义了常量ULONG_MAX和UINT_MAX).]

这意味着

int a = -1, b=2, c;
c= a << b ;
Run Code Online (Sandbox Code Playgroud)

在C中调用未定义的行为,但行为在C++中定义良好.

是什么迫使ISO C++委员会考虑与C中的行为相对应的行为?

另一方面,implementation defined当左操作数为负时,行为是按位右移操作,对吗?

我的问题是为什么左移操作在C中调用未定义的行为,为什么右移操作符只调用实现定义的行为?

PS:请不要给出答案,例如"这是未定义的行为,因为标准是这样说的".:P

c c++ bit-shift undefined-behavior language-lawyer

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

AND 0xFF做什么?

在以下代码中:

short = ((byte2 << 8) | (byte1 & 0xFF))
Run Code Online (Sandbox Code Playgroud)

目的是&0xFF什么?因为其他有时我认为它写成:

short = ((byte2 << 8) | byte1)
Run Code Online (Sandbox Code Playgroud)

这似乎也很好吗?

c bit-manipulation bit-shift bitwise-operators

41
推荐指数
5
解决办法
8万
查看次数

为什么 11010100 &lt;&lt; 1 等于 110101000,而不是 10101000?

为什么当我尝试为 11010100 2移位时,结果是 110101000 2,而不是 10101000 2

int a = Integer.parseInt("11010100", 2) << 1;
Run Code Online (Sandbox Code Playgroud)

我尝试这样做:

int a = (byte)(Integer.parseInt("11010100", 2) << 1);
Run Code Online (Sandbox Code Playgroud)

但如果输出值大于 128,则一切都变为负,这是合乎逻辑的。我怎样才能使位数不变?

java bit-shift

41
推荐指数
3
解决办法
5035
查看次数

为什么在一个表达式中同时使用左移和右移会有所不同?

我有以下代码:

unsigned char x = 255;
printf("%x\n", x); // ff

unsigned char tmp = x << 7;
unsigned char y = tmp >> 7;
printf("%x\n", y); // 1

unsigned char z = (x << 7) >> 7;
printf("%x\n", z); // ff
Run Code Online (Sandbox Code Playgroud)

我会期望y并且z是一样的。但它们因是否使用中间变量而异。知道为什么会这样会很有趣。

c operators bit-shift integer-promotion language-lawyer

39
推荐指数
3
解决办法
1202
查看次数