我正在做作业关于位运算符,我不能做出正面或反面就可以了,我想我已经相当挂了字节序.也就是说,我正在使用一个小端机器(像大多数人一样),但是这需要考虑还是浪费的事实?
如果重要,我正在使用C.
我已经看过运算符>>和我看过的<<各种代码(我实际上并没有理解),但我只是想知道它们实际上做了什么以及它们的实际用途是什么.
编辑
如果移位是喜欢x * 2和x / 2,就是从实际使用的真正的区别*和/运营商?有性能差异吗?
当我编写以下程序并使用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 .
我很擅长处理比特,并且在编译时遇到以下警告:
Run Code Online (Sandbox Code Playgroud)7: warning: left shift count >= width of type
我的第7行看起来像这样
unsigned long int x = 1 << 32;
Run Code Online (Sandbox Code Playgroud)
如果long我的系统的大小是32位,这将是有意义的.但是,sizeof(long)返回8并CHAR_BIT定义为8建议long应为8x8 = 64位长.
我在这里错过了什么?是sizeof和CHAR_BIT不准确还是我误解了一些基本的东西?
我会感谢一个很好的教程,为Java新手解释如何在java中所有的"位移"工作.
我总是偶然发现它,但从未理解它是如何工作的.它应该解释java中使用byteshifting/bitmanipulation可能实现的所有操作和概念.
这只是我的意思的一个例子,(但我正在寻找一个解释每个可能的操作的教程):
byte b = (byte)(l >> (8 - i << 3));
Run Code Online (Sandbox Code Playgroud) 基本上是标题中的问题.我正在看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)
而我只是好奇双左眼角饼干的<<作用.
在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
在以下代码中:
short = ((byte2 << 8) | (byte1 & 0xFF))
Run Code Online (Sandbox Code Playgroud)
目的是&0xFF什么?因为其他有时我认为它写成:
short = ((byte2 << 8) | byte1)
Run Code Online (Sandbox Code Playgroud)
这似乎也很好吗?
为什么当我尝试为 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,则一切都变为负,这是合乎逻辑的。我怎样才能使位数不变?
我有以下代码:
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是一样的。但它们因是否使用中间变量而异。知道为什么会这样会很有趣。