“按位左移”的版本间的差异
(Created page with "*'''Bitwise AND (&), Bitwise OR (|), Bitwise XOR (^)''' 按位与(&) 按位操作符对变量进行位级别的计算。它们能解决很多常见的编程问题。下...") |
|||
第1行: | 第1行: | ||
− | *''' | + | *'''bitshift left (<<), bitshift right (>>)''' |
− | + | *'''描述''' | |
− | + | 出自Playground的 The Bitmath Tutorial 在C++语言中有两个移位运算符: | |
− | + | 左移位运算符(«)和右移运算符(»)。这些操作符可使左运算元中的某些位移动右运算元中指定的位数。 | |
− | + | *'''语法''' | |
+ | <pre style="color:green"> | ||
− | + | variable « number_of_bits variable » number_of_bits | |
+ | </pre> | ||
− | + | *'''参数''' | |
+ | <pre style="color:green"> | ||
− | + | variable - (byte, int, long) number_of_bits integer ⇐ 32 | |
− | |||
− | - | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</pre> | </pre> | ||
− | + | *'''例子''' | |
+ | <pre style="color:green"> | ||
− | + | int a = 5; // 二进制数: 0000000000000101 | |
+ | int b = a << 3; // 二进制数: 0000000000101000, 或十进制数:40 | ||
+ | int c = b >> 3; // 二进制数: 0000000000000101, 或者说回到开始时的5 | ||
+ | </pre> | ||
− | + | 当你将x左移y位时(x«y),x中最左边的y位会逐个逐个的丢失: | |
+ | <pre style="color:green"> | ||
− | + | int a = 5; // 二进制: 0000000000000101 | |
+ | int b = a << 14; // 二进制: 0100000000000000 - 101中最左边的1被丢弃 | ||
+ | 如果你确定位移不会引起数据溢出,你可以简单的把左移运算当做对左运算元进行2的右运算元次方的操作。例如,要产生2的次方,可使用下面的方式: | ||
+ | <pre style="color:green"> | ||
− | 0 | + | 1 << 0 == 1 |
− | + | 1 << 1 == 2 | |
− | + | 1 << 2 == 4 | |
− | + | 1 << 3 == 8 | |
− | + | ... | |
− | < | + | 1 << 8 == 256 |
− | + | 1 << 9 == 512 | |
− | + | 10 << 1 == 1024 | |
− | + | ... | |
</pre> | </pre> | ||
− | + | 当你将x右移y位(x»y),如果x最高位是1,位移结果将取决于x的数据类型。如果x是int类型,最高位为符号位,确定是否x是负数或不是,正如我们上面的讨论。如果x类型为int,则最高位是符号位,正如我们以前讨论过,符号位表示x是正还是负。在这种情况下,由于深奥的历史原因,符号位被复制到较低位: | |
+ | <pre style="color:green"> | ||
− | + | X = -16; //二进制:1111111111110000 | |
+ | Y = X >> 3 //二进制:1111111111111110 | ||
+ | </pre> | ||
− | + | 这种结果,被称为符号扩展,往往不是你想要的行为。你可能希望左边被移入的数是0。右移操作对无符号整型来说会有不同结果,你可以通过数据强制转换改变从左边移入的数据: | |
+ | <pre style="color:green"> | ||
− | + | X = -16; //二进制:1111111111110000 | |
+ | int y = (unsigned int)x >> 3; // 二进制: 0001111111111110 | ||
+ | </pre> | ||
− | + | 如果你能小心的避免符号扩展问题,你可以将右移操作当做对数据除2运算。例如: | |
− | |||
− | |||
<pre style="color:green"> | <pre style="color:green"> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | INT = 1000; | |
− | + | Y = X >> 3; 8 1000 //1000整除8,使y=125 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</pre> | </pre> | ||
− | |||
[[https://www.microduino.cn/wiki/index.php/Arduino_%E8%AF%AD%E6%B3%95%E6%89%8B%E5%86%8C/zh 返回Arduino语法手册]] | [[https://www.microduino.cn/wiki/index.php/Arduino_%E8%AF%AD%E6%B3%95%E6%89%8B%E5%86%8C/zh 返回Arduino语法手册]] |
2016年3月28日 (一) 09:27的最新版本
- bitshift left (<<), bitshift right (>>)
- 描述
出自Playground的 The Bitmath Tutorial 在C++语言中有两个移位运算符:
左移位运算符(«)和右移运算符(»)。这些操作符可使左运算元中的某些位移动右运算元中指定的位数。
- 语法
variable « number_of_bits variable » number_of_bits
- 参数
variable - (byte, int, long) number_of_bits integer ⇐ 32
- 例子
int a = 5; // 二进制数: 0000000000000101 int b = a << 3; // 二进制数: 0000000000101000, 或十进制数:40 int c = b >> 3; // 二进制数: 0000000000000101, 或者说回到开始时的5
当你将x左移y位时(x«y),x中最左边的y位会逐个逐个的丢失:
int a = 5; // 二进制: 0000000000000101 int b = a << 14; // 二进制: 0100000000000000 - 101中最左边的1被丢弃 如果你确定位移不会引起数据溢出,你可以简单的把左移运算当做对左运算元进行2的右运算元次方的操作。例如,要产生2的次方,可使用下面的方式: <pre style="color:green"> 1 << 0 == 1 1 << 1 == 2 1 << 2 == 4 1 << 3 == 8 ... 1 << 8 == 256 1 << 9 == 512 10 << 1 == 1024 ...
当你将x右移y位(x»y),如果x最高位是1,位移结果将取决于x的数据类型。如果x是int类型,最高位为符号位,确定是否x是负数或不是,正如我们上面的讨论。如果x类型为int,则最高位是符号位,正如我们以前讨论过,符号位表示x是正还是负。在这种情况下,由于深奥的历史原因,符号位被复制到较低位:
X = -16; //二进制:1111111111110000 Y = X >> 3 //二进制:1111111111111110
这种结果,被称为符号扩展,往往不是你想要的行为。你可能希望左边被移入的数是0。右移操作对无符号整型来说会有不同结果,你可以通过数据强制转换改变从左边移入的数据:
X = -16; //二进制:1111111111110000 int y = (unsigned int)x >> 3; // 二进制: 0001111111111110
如果你能小心的避免符号扩展问题,你可以将右移操作当做对数据除2运算。例如:
INT = 1000; Y = X >> 3; 8 1000 //1000整除8,使y=125