我有这个代码.
#include <iostream>
int main()
{
unsigned long int i = 1U << 31;
std::cout << i << std::endl;
unsigned long int uwantsum = 1 << 31;
std::cout << uwantsum << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印出来.
2147483648
18446744071562067968
Run Code Online (Sandbox Code Playgroud)
在Arch Linux 64位,gcc,常春藤桥架构上.
第一个结果是有道理的,但我不明白第二个数字的来源.1表示为4byte int signed或unsigned is
00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)
当你向左移动31次时,你最终得到了
10000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
没有?我知道向左移动正数基本上是2 ^ k,其中k是你移动它的次数,假设它仍然适合于界限.为什么我得到这么奇怪的数字?
在c#中将两个uint组合成ulong的最佳方法是什么,设置高/低uints.
我知道bitshifting可以做到这一点,但我不知道语法,或者可能有其他API来帮助像BitConverter,但我没有看到一个方法做我想要的.
我理解按位操作以及它们如何用于不同目的,例如权限.但是,我似乎不明白比特移位运算符的用途.我理解他们是如何工作的,但我想不出任何我可能想要使用它们的场景,除非我想做一些非常快速的乘法或除法.有没有其他理由使用位移?
我正在查看一些代码,这些代码输出一个带有前置0的二进制形式的数字.
byte number = 48;
int i = 256; //max number * 2
while( (i >>= 1) > 0) {
System.out.print(((number & i) != 0 ? "1" : "0"));
}
Run Code Online (Sandbox Code Playgroud)
并且不明白它的i >>= 1作用.我知道i >> 1向右移动1位但不明白它的=作用,据我所知,不可能搜索">> ="来找出它意味着什么.
我最近在一次采访中被问到,只使用位移操作符,编写一些代码,告诉你一个数字是否可被8整除,显然代码很短 - 有没有人有线索?
我已经使用Perl 6开始,我目前从我的Java项目移植了一些代码,他们使用Java的移位操作符<<和>>,还有>>>运营商.
目前我正在使用+> \ +<(和~>)运营商来弥补这一点,但它们是否相同?
某些语言(例如 Java、Verilog)同时具有按位逻辑运算符(<<、>>)和算术移位运算符(<<<、>>>)。
对于无符号值,逻辑移位和算术移位具有相同的操作。假设 8'b11000101 是 8 位无符号数 197 的二进制表示,那么
8'b11000101 >> 2 => 8'b00110001
8'b11000101 >>> 2 => 8'b00110001
8'b11000101 << 2 => 8'b00010100
8'b11000101 <<< 2 => 8'b00010100
Run Code Online (Sandbox Code Playgroud)
对于有符号值,只有算术和逻辑左移操作是相同的,但算术右移会导致符号扩展。假设 8'b11000101 是 8 位有符号数 -59 的二进制表示,那么
8'b11000101 >> 2 => 8'b00110001
8'b11000101 >>> 2 => 8'b11110001
8'b11000101 << 2 => 8'b00010100
8'b11000101 <<< 2 => 8'b00010100
Run Code Online (Sandbox Code Playgroud)
Python只有逻辑移位运算符,没有算术移位运算符。那么如何在Python中实现有符号和无符号值的算术右移呢?
在 C 语言中,许多运算都采用位移位,其中经常使用整数文字。例如,考虑以下代码片段:
#define test_bit(n, flag) (1UL << (n) & (flag))
Run Code Online (Sandbox Code Playgroud)
据我所知,整数文字后缀UL应该抑制移位中不需要的行为,例如对有符号整数进行符号扩展可能会导致设置多个位。但是,如果情况只是进行左移,如上所示,我们还需要整数文字后缀吗?
由于左移不会导致意外行为,因此我无法弄清楚其目的是什么。像上面这样的代码经常出现在Linux内核等项目中,这让我觉得一定是有需要的。UL有谁知道这种情况下后缀的用途吗?